fluent-plugin-grok-parser 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Rakefile +36 -0
- data/appveyor.yml +31 -0
- data/fluent-plugin-grok-parser.gemspec +1 -1
- data/patterns/aws +3 -3
- data/patterns/grok-patterns +1 -1
- data/patterns/haproxy +1 -1
- data/patterns/httpd +2 -2
- data/patterns/linux-syslog +1 -1
- data/test/fixtures/my_pattern +1 -0
- data/test/helper.rb +5 -0
- data/test/test_grok_parser.rb +3 -11
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6d4b24f282982ed42f113abab9b094bba14f27354f1040956329986a53257f13
|
4
|
+
data.tar.gz: 421fb6798ce3c8636bd2258bf8a252eef1fe01025203cb9bd3017950b8541948
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dee3c7bd1c321166dffa95cf65a001e8f066e2eafe745e928eab1b0c6e191a5ba4c2f21710f5ecb61f583571a029dd0c25cf187d8da98c746e5e830877c51c64
|
7
|
+
data.tar.gz: 4250e3d3f0b79c36f1993e2c27bfcc0258b2a69abb2ddad7765fdbdbe879d1eae9bbafdd3a9d1111c6094718dcda6d4b137df6ada6441cba89221f461a4dff95
|
data/Rakefile
CHANGED
@@ -20,6 +20,42 @@ task "patterns:import" do
|
|
20
20
|
cp(pattern, "patterns/", verbose: true)
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
# copied from "./lib/fluent/plugin/grok"
|
25
|
+
pattern_re =
|
26
|
+
/%\{ # match '%{' not prefixed with '\'
|
27
|
+
(?<name> # match the pattern name
|
28
|
+
(?<pattern>[A-z0-9]+)
|
29
|
+
(?::(?<subname>[@\[\]A-z0-9_:.-]+?)
|
30
|
+
(?::(?<type>(?:string|bool|integer|float|int|
|
31
|
+
time(?::.+)?|
|
32
|
+
array(?::.)?)))?)?
|
33
|
+
)
|
34
|
+
\}/x
|
35
|
+
|
36
|
+
Dir.glob("patterns/*") do |pattern_file|
|
37
|
+
new_lines = ""
|
38
|
+
File.readlines(pattern_file).each do |line|
|
39
|
+
case
|
40
|
+
when line.strip.empty?
|
41
|
+
new_lines << line
|
42
|
+
when line.start_with?("#")
|
43
|
+
new_lines << line
|
44
|
+
else
|
45
|
+
name, pattern = line.split(/\s+/, 2)
|
46
|
+
new_pattern = pattern.gsub(pattern_re) do |m|
|
47
|
+
matched = $~
|
48
|
+
if matched[:type] == "int"
|
49
|
+
"%{#{matched[:pattern]}:#{matched[:subname]}:integer}"
|
50
|
+
else
|
51
|
+
m
|
52
|
+
end
|
53
|
+
end
|
54
|
+
new_lines << "#{name} #{new_pattern}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
File.write(pattern_file, new_lines)
|
58
|
+
end
|
23
59
|
end
|
24
60
|
|
25
61
|
task :default => [:test, :build]
|
data/appveyor.yml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
version: '{build}'
|
2
|
+
install:
|
3
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
4
|
+
- "%devkit%\\devkitvars.bat"
|
5
|
+
- ruby --version
|
6
|
+
- gem --version
|
7
|
+
- bundle install
|
8
|
+
build: off
|
9
|
+
test_script:
|
10
|
+
- bundle exec rake test
|
11
|
+
|
12
|
+
# https://www.appveyor.com/docs/installed-software/#ruby
|
13
|
+
environment:
|
14
|
+
matrix:
|
15
|
+
- ruby_version: "23-x64"
|
16
|
+
devkit: C:\Ruby23-x64\DevKit
|
17
|
+
- ruby_version: "23"
|
18
|
+
devkit: C:\Ruby23\DevKit
|
19
|
+
- ruby_version: "22-x64"
|
20
|
+
devkit: C:\Ruby23-x64\DevKit
|
21
|
+
- ruby_version: "21-x64"
|
22
|
+
devkit: C:\Ruby23-x64\DevKit
|
23
|
+
- ruby_version: "22"
|
24
|
+
devkit: C:\Ruby23\DevKit
|
25
|
+
WIN_RAPID: true
|
26
|
+
- ruby_version: "21"
|
27
|
+
devkit: C:\Ruby23\DevKit
|
28
|
+
WIN_RAPID: true
|
29
|
+
matrix:
|
30
|
+
allow_failures:
|
31
|
+
- ruby_version: "21"
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "fluent-plugin-grok-parser"
|
7
|
-
spec.version = "2.1.
|
7
|
+
spec.version = "2.1.5"
|
8
8
|
spec.authors = ["kiyoto", "Kenji Okimoto"]
|
9
9
|
spec.email = ["kiyoto@treasure-data.com", "okimoto@clear-code.com"]
|
10
10
|
spec.summary = %q{Fluentd plugin to support Logstash-inspired Grok format for parsing logs}
|
data/patterns/aws
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
S3_REQUEST_LINE (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})
|
2
2
|
|
3
|
-
S3_ACCESS_LOG %{WORD:owner} %{NOTSPACE:bucket} \[%{HTTPDATE:timestamp}\] %{IP:clientip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} (?:"%{S3_REQUEST_LINE}"|-) (?:%{INT:response:
|
3
|
+
S3_ACCESS_LOG %{WORD:owner} %{NOTSPACE:bucket} \[%{HTTPDATE:timestamp}\] %{IP:clientip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} (?:"%{S3_REQUEST_LINE}"|-) (?:%{INT:response:integer}|-) (?:-|%{NOTSPACE:error_code}) (?:%{INT:bytes:integer}|-) (?:%{INT:object_size:integer}|-) (?:%{INT:request_time_ms:integer}|-) (?:%{INT:turnaround_time_ms:integer}|-) (?:%{QS:referrer}|-) (?:"?%{QS:agent}"?|-) (?:-|%{NOTSPACE:version_id})
|
4
4
|
|
5
5
|
ELB_URIPATHPARAM %{URIPATH:path}(?:%{URIPARAM:params})?
|
6
6
|
|
@@ -8,7 +8,7 @@ ELB_URI %{URIPROTO:proto}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST:urihost})?(?:%{
|
|
8
8
|
|
9
9
|
ELB_REQUEST_LINE (?:%{WORD:verb} %{ELB_URI:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})
|
10
10
|
|
11
|
-
ELB_ACCESS_LOG %{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:elb} %{IP:clientip}:%{INT:clientport:
|
11
|
+
ELB_ACCESS_LOG %{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:elb} %{IP:clientip}:%{INT:clientport:integer} (?:(%{IP:backendip}:?:%{INT:backendport:integer})|-) %{NUMBER:request_processing_time:float} %{NUMBER:backend_processing_time:float} %{NUMBER:response_processing_time:float} %{INT:response:integer} %{INT:backend_response:integer} %{INT:received_bytes:integer} %{INT:bytes:integer} "%{ELB_REQUEST_LINE}"
|
12
12
|
|
13
|
-
CLOUDFRONT_ACCESS_LOG (?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}\t%{TIME})\t%{WORD:x_edge_location}\t(?:%{NUMBER:sc_bytes:
|
13
|
+
CLOUDFRONT_ACCESS_LOG (?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}\t%{TIME})\t%{WORD:x_edge_location}\t(?:%{NUMBER:sc_bytes:integer}|-)\t%{IPORHOST:clientip}\t%{WORD:cs_method}\t%{HOSTNAME:cs_host}\t%{NOTSPACE:cs_uri_stem}\t%{NUMBER:sc_status:integer}\t%{GREEDYDATA:referrer}\t%{GREEDYDATA:agent}\t%{GREEDYDATA:cs_uri_query}\t%{GREEDYDATA:cookies}\t%{WORD:x_edge_result_type}\t%{NOTSPACE:x_edge_request_id}\t%{HOSTNAME:x_host_header}\t%{URIPROTO:cs_protocol}\t%{INT:cs_bytes:integer}\t%{GREEDYDATA:time_taken:float}\t%{GREEDYDATA:x_forwarded_for}\t%{GREEDYDATA:ssl_protocol}\t%{GREEDYDATA:ssl_cipher}\t%{GREEDYDATA:x_edge_response_result_type}
|
14
14
|
|
data/patterns/grok-patterns
CHANGED
@@ -37,7 +37,7 @@ PATH (?:%{UNIXPATH}|%{WINPATH})
|
|
37
37
|
UNIXPATH (/([\w_%!$@:.,+~-]+|\\.)*)+
|
38
38
|
TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
|
39
39
|
WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
|
40
|
-
URIPROTO [A-Za-z]
|
40
|
+
URIPROTO [A-Za-z]([A-Za-z0-9+\-.]+)+
|
41
41
|
URIHOST %{IPORHOST}(?::%{POSINT:port})?
|
42
42
|
# uripath comes loosely from RFC1738, but mostly from what Firefox
|
43
43
|
# doesn't turn into %XX
|
data/patterns/haproxy
CHANGED
@@ -31,7 +31,7 @@ HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:captured_response_headers}
|
|
31
31
|
# HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:response_header_content_type}\|%{DATA:response_header_content_encoding}\|%{DATA:response_header_cache_control}\|%{DATA:response_header_last_modified}
|
32
32
|
|
33
33
|
# parse a haproxy 'httplog' line
|
34
|
-
HAPROXYHTTPBASE %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} (\{%{HAPROXYCAPTUREDREQUESTHEADERS}\})?( )?(\{%{HAPROXYCAPTUREDRESPONSEHEADERS}\})?( )?"(<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://)?(?:%{USER:http_user}(?::[^@]*)?@)?(?:%{URIHOST:http_host})?(?:%{URIPATHPARAM:http_request})?( HTTP/%{NUMBER:http_version})?))?"
|
34
|
+
HAPROXYHTTPBASE %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} (\{%{HAPROXYCAPTUREDREQUESTHEADERS}\})?( )?(\{%{HAPROXYCAPTUREDRESPONSEHEADERS}\})?( )?"(<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://)?(?:%{USER:http_user}(?::[^@]*)?@)?(?:%{URIHOST:http_host})?(?:%{URIPATHPARAM:http_request})?( HTTP/%{NUMBER:http_version})?))?"?
|
35
35
|
|
36
36
|
HAPROXYHTTP (?:%{SYSLOGTIMESTAMP:syslog_timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) %{IPORHOST:syslog_server} %{SYSLOGPROG}: %{HAPROXYHTTPBASE}
|
37
37
|
|
data/patterns/httpd
CHANGED
@@ -7,9 +7,9 @@ HTTPD_COMBINEDLOG %{HTTPD_COMMONLOG} %{QS:referrer} %{QS:agent}
|
|
7
7
|
|
8
8
|
# Error logs
|
9
9
|
HTTPD20_ERRORLOG \[%{HTTPDERROR_DATE:timestamp}\] \[%{LOGLEVEL:loglevel}\] (?:\[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:message}
|
10
|
-
HTTPD24_ERRORLOG \[%{HTTPDERROR_DATE:timestamp}\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{POSINT:pid}:tid %{NUMBER:tid}
|
10
|
+
HTTPD24_ERRORLOG \[%{HTTPDERROR_DATE:timestamp}\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{POSINT:pid}(:tid %{NUMBER:tid})?\]( \(%{POSINT:proxy_errorcode}\)%{DATA:proxy_message}:)?( \[client %{IPORHOST:clientip}:%{POSINT:clientport}\])?( %{DATA:errorcode}:)? %{GREEDYDATA:message}
|
11
11
|
HTTPD_ERRORLOG %{HTTPD20_ERRORLOG}|%{HTTPD24_ERRORLOG}
|
12
12
|
|
13
13
|
# Deprecated
|
14
14
|
COMMONAPACHELOG %{HTTPD_COMMONLOG}
|
15
|
-
COMBINEDAPACHELOG %{HTTPD_COMBINEDLOG}
|
15
|
+
COMBINEDAPACHELOG %{HTTPD_COMBINEDLOG}
|
data/patterns/linux-syslog
CHANGED
@@ -11,6 +11,6 @@ SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message}
|
|
11
11
|
# IETF 5424 syslog(8) format (see http://www.rfc-editor.org/info/rfc5424)
|
12
12
|
SYSLOG5424PRI <%{NONNEGINT:syslog5424_pri}>
|
13
13
|
SYSLOG5424SD \[%{DATA}\]+
|
14
|
-
SYSLOG5424BASE %{SYSLOG5424PRI}%{NONNEGINT:syslog5424_ver} +(?:%{TIMESTAMP_ISO8601:syslog5424_ts}|-) +(?:%{
|
14
|
+
SYSLOG5424BASE %{SYSLOG5424PRI}%{NONNEGINT:syslog5424_ver} +(?:%{TIMESTAMP_ISO8601:syslog5424_ts}|-) +(?:%{IPORHOST:syslog5424_host}|-) +(-|%{SYSLOG5424PRINTASCII:syslog5424_app}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_proc}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_msgid}) +(?:%{SYSLOG5424SD:syslog5424_sd}|-|)
|
15
15
|
|
16
16
|
SYSLOG5424LINE %{SYSLOG5424BASE} +%{GREEDYDATA:syslog5424_msg}
|
@@ -0,0 +1 @@
|
|
1
|
+
MY_AWESOME_PATTERN %{GREEDYDATA:message}
|
data/test/helper.rb
CHANGED
@@ -2,9 +2,14 @@ require "fluent/test"
|
|
2
2
|
require "fluent/test/helpers"
|
3
3
|
require "fluent/test/driver/input"
|
4
4
|
require "fluent/test/driver/parser"
|
5
|
+
require "pathname"
|
5
6
|
|
6
7
|
Test::Unit::TestCase.include(Fluent::Test::Helpers)
|
7
8
|
|
9
|
+
def fixtures(name)
|
10
|
+
Pathname(__dir__).expand_path + "fixtures" + name
|
11
|
+
end
|
12
|
+
|
8
13
|
def unused_port
|
9
14
|
s = TCPServer.open(0)
|
10
15
|
port = s.addr[1]
|
data/test/test_grok_parser.rb
CHANGED
@@ -69,17 +69,9 @@ class GrokParserTest < ::Test::Unit::TestCase
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def test_call_for_custom_pattern
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
begin
|
76
|
-
internal_test_grok_pattern("%{MY_AWESOME_PATTERN:message}", "this is awesome",
|
77
|
-
nil, {"message" => "this is awesome"},
|
78
|
-
"custom_pattern_path" => pattern_file.path
|
79
|
-
)
|
80
|
-
ensure
|
81
|
-
File.delete(pattern_file.path)
|
82
|
-
end
|
72
|
+
internal_test_grok_pattern("%{MY_AWESOME_PATTERN:message}", "this is awesome",
|
73
|
+
nil, {"message" => "this is awesome"},
|
74
|
+
"custom_pattern_path" => fixtures("my_pattern").to_s)
|
83
75
|
end
|
84
76
|
|
85
77
|
class OptionalType < self
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-grok-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kiyoto
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- LICENSE
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
|
+
- appveyor.yml
|
84
85
|
- fluent-plugin-grok-parser.gemspec
|
85
86
|
- lib/fluent/plugin/grok.rb
|
86
87
|
- lib/fluent/plugin/parser_grok.rb
|
@@ -107,6 +108,7 @@ files:
|
|
107
108
|
- patterns/redis
|
108
109
|
- patterns/ruby
|
109
110
|
- patterns/squid
|
111
|
+
- test/fixtures/my_pattern
|
110
112
|
- test/helper.rb
|
111
113
|
- test/test_grok_parser.rb
|
112
114
|
- test/test_grok_parser_in_tcp.rb
|
@@ -131,11 +133,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
133
|
version: '0'
|
132
134
|
requirements: []
|
133
135
|
rubyforge_project:
|
134
|
-
rubygems_version: 2.
|
136
|
+
rubygems_version: 2.7.4
|
135
137
|
signing_key:
|
136
138
|
specification_version: 4
|
137
139
|
summary: Fluentd plugin to support Logstash-inspired Grok format for parsing logs
|
138
140
|
test_files:
|
141
|
+
- test/fixtures/my_pattern
|
139
142
|
- test/helper.rb
|
140
143
|
- test/test_grok_parser.rb
|
141
144
|
- test/test_grok_parser_in_tcp.rb
|