fluent-plugin-grok-parser 2.4.0 → 2.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -5
- data/README.md +35 -3
- data/appveyor.yml +3 -30
- data/fluent-plugin-grok-parser.gemspec +1 -1
- data/lib/fluent/plugin/grok.rb +10 -2
- data/lib/fluent/plugin/parser_grok.rb +5 -0
- data/patterns/grok-patterns +3 -3
- data/patterns/haproxy +1 -1
- data/patterns/httpd +3 -3
- data/patterns/java +1 -3
- data/patterns/linux-syslog +1 -1
- data/patterns/nagios +1 -1
- data/test/test_grok_parser.rb +90 -23
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a5f5cd1dd1aa1de7edd4425755616b0488492d32847b8e254d79d0385d3cbd4
|
4
|
+
data.tar.gz: cc629c894253715304a18b3eccc2a2caba04069b9b22124893a8e77dacbf4c44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7548442e6f18c3b302df37f9f8d9300374f116236fcecb30c8e2426e65f43038e011a312ff4641d779c26fd95f6f3d38db17145ea793a2a29f34b2ab7c6d0709
|
7
|
+
data.tar.gz: b5e05fbefb609cf206ddbbf8347a9e9f93e4ba4a4eb2aa1d653db6b54332c311b4c388d8cf7e85fad2d10919d444a2bb6a5fe7677024f999d43cfd7680785b9c
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -95,8 +95,7 @@ You can use this parser without `multiline_start_regexp` when you know your data
|
|
95
95
|
|
96
96
|
## Configurations
|
97
97
|
|
98
|
-
* See also: [
|
99
|
-
* See also: [Parser Plugin Overview](https://docs.fluentd.org/v1.0/articles/parser-plugin-overview)
|
98
|
+
* See also: [Config: Parse Section - Fluentd](https://docs.fluentd.org/configuration/parse-section)
|
100
99
|
|
101
100
|
* **time_format** (string) (optional): The format of the time field.
|
102
101
|
* **grok_pattern** (string) (optional): The pattern of grok. You cannot specify multiple grok pattern with this.
|
@@ -105,6 +104,17 @@ You can use this parser without `multiline_start_regexp` when you know your data
|
|
105
104
|
* **grok_name_key** (string) (optional): The key name to store grok section's name
|
106
105
|
* **multi_line_start_regexp** (string) (optional): The regexp to match beginning of multiline. This is only for "multiline_grok".
|
107
106
|
|
107
|
+
### \<grok\> section (optional) (multiple)
|
108
|
+
|
109
|
+
* **name** (string) (optional): The name of this grok section
|
110
|
+
* **pattern** (string) (required): The pattern of grok
|
111
|
+
* **keep_time_key** (bool) (optional): If true, keep time field in the record.
|
112
|
+
* **time_key** (string) (optional): Specify time field for event time. If the event doesn't have this field, current time is used.
|
113
|
+
* Default value: `time`.
|
114
|
+
* **time_format** (string) (optional): Process value using specified format. This is available only when time_type is string
|
115
|
+
* **timezone** (string) (optional): Use specified timezone. one can parse/format the time value in the specified timezone.
|
116
|
+
|
117
|
+
|
108
118
|
## Examples
|
109
119
|
|
110
120
|
### Using grok\_failure\_key
|
@@ -184,6 +194,28 @@ This will add keys like following:
|
|
184
194
|
Add `grokfailure` key to the record if the record does not match any grok pattern.
|
185
195
|
See also test code for more details.
|
186
196
|
|
197
|
+
## How to parse time value using specific timezone
|
198
|
+
|
199
|
+
```aconf
|
200
|
+
<source>
|
201
|
+
@type tail
|
202
|
+
path /path/to/log
|
203
|
+
tag grokked_log
|
204
|
+
<parse>
|
205
|
+
@type grok
|
206
|
+
<grok>
|
207
|
+
name mylog-without-timezone
|
208
|
+
pattern %{DATESTAMP:time} %{GREEDYDATE:message}
|
209
|
+
timezone Asia/Tokyo
|
210
|
+
</grok>
|
211
|
+
</parse>
|
212
|
+
</source>
|
213
|
+
```
|
214
|
+
|
215
|
+
This will parse the `time` value as "Asia/Tokyo" timezone.
|
216
|
+
|
217
|
+
See [Config: Parse Section - Fluentd](https://docs.fluentd.org/configuration/parse-section) for more details about timezone.
|
218
|
+
|
187
219
|
## How to write Grok patterns
|
188
220
|
|
189
221
|
Grok patterns look like `%{PATTERN_NAME:name}` where ":name" is optional. If "name" is provided, then it
|
@@ -271,7 +303,7 @@ Here is a sample config using the Grok parser with `in_tail` and the `types` par
|
|
271
303
|
|
272
304
|
If you want to use this plugin with Fluentd v0.12.x or earlier, you can use this plugin version v1.x.
|
273
305
|
|
274
|
-
See also: [Plugin Management | Fluentd](
|
306
|
+
See also: [Plugin Management | Fluentd](https://docs.fluentd.org/deployment/plugin-management)
|
275
307
|
|
276
308
|
## License
|
277
309
|
|
data/appveyor.yml
CHANGED
@@ -5,11 +5,9 @@ version: '{build}'
|
|
5
5
|
|
6
6
|
install:
|
7
7
|
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
8
|
-
- IF %ridk%==0 "%devkit%\\devkitvars.bat"
|
9
8
|
- ruby --version
|
10
9
|
- gem --version
|
11
|
-
-
|
12
|
-
- IF %ridk%==1 ridk.cmd exec bundle install
|
10
|
+
- ridk.cmd exec bundle install
|
13
11
|
build: off
|
14
12
|
test_script:
|
15
13
|
- bundle exec rake test
|
@@ -17,34 +15,9 @@ test_script:
|
|
17
15
|
# https://www.appveyor.com/docs/installed-software/#ruby
|
18
16
|
environment:
|
19
17
|
matrix:
|
18
|
+
- ruby_version: "26-x64"
|
19
|
+
- ruby_version: "26"
|
20
20
|
- ruby_version: "25-x64"
|
21
|
-
ridk: 1
|
22
21
|
- ruby_version: "25"
|
23
|
-
ridk: 1
|
24
22
|
- ruby_version: "24-x64"
|
25
|
-
ridk: 1
|
26
23
|
- ruby_version: "24"
|
27
|
-
ridk: 1
|
28
|
-
- ruby_version: "23-x64"
|
29
|
-
devkit: C:\Ruby23-x64\DevKit
|
30
|
-
ridk: 0
|
31
|
-
- ruby_version: "23"
|
32
|
-
devkit: C:\Ruby23\DevKit
|
33
|
-
ridk: 0
|
34
|
-
- ruby_version: "22-x64"
|
35
|
-
devkit: C:\Ruby23-x64\DevKit
|
36
|
-
ridk: 0
|
37
|
-
- ruby_version: "21-x64"
|
38
|
-
devkit: C:\Ruby23-x64\DevKit
|
39
|
-
ridk: 0
|
40
|
-
- ruby_version: "22"
|
41
|
-
devkit: C:\Ruby23\DevKit
|
42
|
-
WIN_RAPID: true
|
43
|
-
ridk: 0
|
44
|
-
- ruby_version: "21"
|
45
|
-
devkit: C:\Ruby23\DevKit
|
46
|
-
WIN_RAPID: true
|
47
|
-
ridk: 0
|
48
|
-
matrix:
|
49
|
-
allow_failures:
|
50
|
-
- 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.
|
7
|
+
spec.version = "2.6.2"
|
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/lib/fluent/plugin/grok.rb
CHANGED
@@ -13,7 +13,7 @@ module Fluent
|
|
13
13
|
(?<pattern>[A-z0-9]+)
|
14
14
|
(?::(?<subname>[@\[\]A-z0-9_:.-]+?)
|
15
15
|
(?::(?<type>(?:string|bool|integer|float|
|
16
|
-
time(
|
16
|
+
time(?::.+?)?|
|
17
17
|
array(?::.)?)))?)?
|
18
18
|
)
|
19
19
|
\}/x
|
@@ -27,6 +27,8 @@ module Fluent
|
|
27
27
|
@multiline_mode = false
|
28
28
|
@conf = conf
|
29
29
|
@plugin = plugin
|
30
|
+
@time_format = nil
|
31
|
+
@timezone = nil
|
30
32
|
if @plugin.respond_to?(:firstline?)
|
31
33
|
@multiline_mode = true
|
32
34
|
end
|
@@ -39,6 +41,9 @@ module Fluent
|
|
39
41
|
if @plugin.respond_to?(:time_format)
|
40
42
|
@time_format = @plugin.time_format
|
41
43
|
end
|
44
|
+
if @plugin.respond_to?(:timezone)
|
45
|
+
@timezone = @plugin.timezone
|
46
|
+
end
|
42
47
|
end
|
43
48
|
|
44
49
|
def add_patterns_from_file(path)
|
@@ -105,6 +110,9 @@ module Fluent
|
|
105
110
|
if conf["time_format"] || @time_format
|
106
111
|
_conf["time_format"] = conf["time_format"] || @time_format
|
107
112
|
end
|
113
|
+
if conf["timezone"] || @timezone
|
114
|
+
_conf["timezone"] = conf["timezone"] || @timezone
|
115
|
+
end
|
108
116
|
_conf["expression"] = regexp
|
109
117
|
config = Fluent::Config::Element.new("parse", "", _conf, [])
|
110
118
|
parser = Fluent::Plugin::RegexpParser.new
|
@@ -131,7 +139,7 @@ module Fluent
|
|
131
139
|
else
|
132
140
|
replacement_pattern = "(?:#{curr_pattern})"
|
133
141
|
end
|
134
|
-
pattern.sub
|
142
|
+
pattern = pattern.sub(m[0]) do |s|
|
135
143
|
replacement_pattern
|
136
144
|
end
|
137
145
|
end
|
@@ -22,9 +22,14 @@ module Fluent
|
|
22
22
|
config_param :name, :string, default: nil
|
23
23
|
desc "The pattern of grok"
|
24
24
|
config_param :pattern, :string
|
25
|
+
desc "If true, keep time field in the record."
|
25
26
|
config_param :keep_time_key, :bool, default: false
|
27
|
+
desc "Specify time field for event time. If the event doesn't have this field, current time is used."
|
26
28
|
config_param :time_key, :string, default: "time"
|
29
|
+
desc "Process value using specified format. This is available only when time_type is string"
|
27
30
|
config_param :time_format, :string, default: nil
|
31
|
+
desc "Use specified timezone. one can parse/format the time value in the specified timezone."
|
32
|
+
config_param :timezone, :string, default: nil
|
28
33
|
end
|
29
34
|
|
30
35
|
def initialize
|
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
|
@@ -48,7 +48,7 @@ URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
|
|
48
48
|
URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
|
49
49
|
|
50
50
|
# Months: January, Feb, 3, 03, 12, December
|
51
|
-
MONTH \b(?:[Jj]an(?:uary|uar)?|[Ff]eb(?:ruary|ruar)?|[Mm](?:a|ä)?r(?:ch|z)?|[Aa]pr(?:il)?|[Mm]a(?:y|i)?|[Jj]un(?:e|i)?|[Jj]ul(?:y)?|[Aa]ug(?:ust)?|[Ss]ep(?:tember)?|[Oo](?:c|k)?t(?:ober)?|[Nn]ov(?:ember)?|[Dd]e(?:c|z)(?:ember)?)\b
|
51
|
+
MONTH \b(?:[Jj]an(?:uary|uar)?|[Ff]eb(?:ruary|ruar)?|[Mm](?:a|ä)?r(?:ch|z)?|[Aa]pr(?:il)?|[Mm]a(?:y|i)?|[Jj]un(?:e|i)?|[Jj]ul(?:y|i)?|[Aa]ug(?:ust)?|[Ss]ep(?:tember)?|[Oo](?:c|k)?t(?:ober)?|[Nn]ov(?:ember)?|[Dd]e(?:c|z)(?:ember)?)\b
|
52
52
|
MONTHNUM (?:0?[1-9]|1[0-2])
|
53
53
|
MONTHNUM2 (?:0[1-9]|1[0-2])
|
54
54
|
MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])
|
@@ -92,4 +92,4 @@ QS %{QUOTEDSTRING}
|
|
92
92
|
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
|
93
93
|
|
94
94
|
# Log Levels
|
95
|
-
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo
|
95
|
+
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo?(?:rmation)?|INFO?(?:RMATION)?|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
|
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
@@ -2,14 +2,14 @@ HTTPDUSER %{EMAILADDRESS}|%{USER}
|
|
2
2
|
HTTPDERROR_DATE %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}
|
3
3
|
|
4
4
|
# Log formats
|
5
|
-
HTTPD_COMMONLOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})"
|
5
|
+
HTTPD_COMMONLOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" (?:-|%{NUMBER:response}) (?:-|%{NUMBER:bytes})
|
6
6
|
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/java
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
JAVACLASS (?:[a-zA-Z$_][a-zA-Z$_0-9]*\.)*[a-zA-Z$_][a-zA-Z$_0-9]*
|
2
2
|
#Space is an allowed character to match special cases like 'Native Method' or 'Unknown Source'
|
3
|
-
JAVAFILE (?:[
|
3
|
+
JAVAFILE (?:[a-zA-Z$_0-9. -]+)
|
4
4
|
#Allow special <init>, <clinit> methods
|
5
5
|
JAVAMETHOD (?:(<(?:cl)?init>)|[a-zA-Z$_][a-zA-Z$_0-9]*)
|
6
6
|
#Line number is optional in special cases 'Native method' or 'Unknown source'
|
7
7
|
JAVASTACKTRACEPART %{SPACE}at %{JAVACLASS:class}\.%{JAVAMETHOD:method}\(%{JAVAFILE:file}(?::%{NUMBER:line})?\)
|
8
8
|
# Java Logs
|
9
9
|
JAVATHREAD (?:[A-Z]{2}-Processor[\d]+)
|
10
|
-
JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
|
11
|
-
JAVAFILE (?:[A-Za-z0-9_.-]+)
|
12
10
|
JAVALOGMESSAGE (.*)
|
13
11
|
# MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM
|
14
12
|
CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM)
|
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}
|
data/patterns/nagios
CHANGED
@@ -89,7 +89,7 @@ NAGIOS_PASSIVE_HOST_CHECK %{NAGIOS_TYPE_PASSIVE_HOST_CHECK:nagios_type}: %{DATA:
|
|
89
89
|
NAGIOS_SERVICE_EVENT_HANDLER %{NAGIOS_TYPE_SERVICE_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
|
90
90
|
NAGIOS_HOST_EVENT_HANDLER %{NAGIOS_TYPE_HOST_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
|
91
91
|
|
92
|
-
NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{
|
92
|
+
NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{NUMBER:nagios_unknown1};%{NUMBER:nagios_unknown2}
|
93
93
|
|
94
94
|
####################
|
95
95
|
#### External checks
|
data/test/test_grok_parser.rb
CHANGED
@@ -158,37 +158,49 @@ class GrokParserTest < ::Test::Unit::TestCase
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
|
162
|
-
|
163
|
-
|
161
|
+
sub_test_case "configure" do
|
162
|
+
test "no grok patterns" do
|
163
|
+
assert_raise Fluent::ConfigError do
|
164
|
+
create_driver('')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
test "invalid config value type" do
|
169
|
+
assert_raise Fluent::ConfigError do
|
170
|
+
create_driver(%[
|
171
|
+
<grok>
|
172
|
+
pattern %{PATH:path:foo}
|
173
|
+
</grok>
|
174
|
+
])
|
175
|
+
end
|
164
176
|
end
|
165
|
-
end
|
166
177
|
|
167
|
-
|
168
|
-
|
169
|
-
create_driver(%[
|
178
|
+
test "invalid config value type and normal grok pattern" do
|
179
|
+
d = create_driver(%[
|
170
180
|
<grok>
|
171
181
|
pattern %{PATH:path:foo}
|
172
182
|
</grok>
|
183
|
+
<grok>
|
184
|
+
pattern %{IP:ip_address}
|
185
|
+
</grok>
|
173
186
|
])
|
187
|
+
assert_equal(1, d.instance.instance_variable_get(:@grok).parsers.size)
|
188
|
+
logs = $log.instance_variable_get(:@logger).instance_variable_get(:@logdev).logs
|
189
|
+
error_logs = logs.grep(/error_class/)
|
190
|
+
assert_equal(1, error_logs.size)
|
191
|
+
error_message = error_logs.first[/error="(.+)"/, 1]
|
192
|
+
assert_equal("unknown value conversion for key:'path', type:'foo'", error_message)
|
174
193
|
end
|
175
|
-
end
|
176
194
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
assert_equal(1, d.instance.instance_variable_get(:@grok).parsers.size)
|
187
|
-
logs = $log.instance_variable_get(:@logger).instance_variable_get(:@logdev).logs
|
188
|
-
error_logs = logs.grep(/error_class/)
|
189
|
-
assert_equal(1, error_logs.size)
|
190
|
-
error_message = error_logs.first[/error="(.+)"/, 1]
|
191
|
-
assert_equal("unknown value conversion for key:'path', type:'foo'", error_message)
|
195
|
+
test "keep original configuration" do
|
196
|
+
config = %[
|
197
|
+
<grok>
|
198
|
+
pattern %{INT:user_id:integer} paid %{NUMBER:paid_amount:float}
|
199
|
+
</grok>
|
200
|
+
]
|
201
|
+
d = create_driver(config)
|
202
|
+
assert_equal("%{INT:user_id:integer} paid %{NUMBER:paid_amount:float}", d.instance.config.elements("grok").first["pattern"])
|
203
|
+
end
|
192
204
|
end
|
193
205
|
|
194
206
|
sub_test_case "grok_name_key" do
|
@@ -347,6 +359,61 @@ class GrokParserTest < ::Test::Unit::TestCase
|
|
347
359
|
assert_equal(event_time("28/Feb/2013:12:00:00 +0900", format: "%d/%b/%Y:%H:%M:%S %z"), time)
|
348
360
|
end
|
349
361
|
end
|
362
|
+
|
363
|
+
test "leading time type with following other type" do
|
364
|
+
d = create_driver(%[
|
365
|
+
<grok>
|
366
|
+
pattern \\[%{HTTPDATE:log_timestamp:time:%d/%b/%Y:%H:%M:%S %z}\\] %{GREEDYDATA:message}
|
367
|
+
</grok>
|
368
|
+
])
|
369
|
+
expected_record = {
|
370
|
+
"log_timestamp" => event_time("03/Feb/2019:06:47:21 +0530", format: "%d/%b/%Y:%H:%M:%S %z"),
|
371
|
+
"message" => "Python-urllib/2.7"
|
372
|
+
}
|
373
|
+
d.instance.parse('[03/Feb/2019:06:47:21 +0530] Python-urllib/2.7') do |time, record|
|
374
|
+
assert_equal(expected_record, record)
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
test "timezone" do
|
379
|
+
d = create_driver(%[
|
380
|
+
<grok>
|
381
|
+
pattern %{TIMESTAMP_ISO8601:time} %{GREEDYDATA:message}
|
382
|
+
time_key time
|
383
|
+
time_format %Y-%m-%d %H:%M:%S
|
384
|
+
timezone Europe/Berlin
|
385
|
+
</grok>
|
386
|
+
])
|
387
|
+
d.instance.parse("2019-02-01 12:34:56 This is test") do |time, record|
|
388
|
+
assert_equal(event_time("2019-02-01 12:34:56 +0100"), time)
|
389
|
+
assert_equal({ "message" => "This is test" }, record)
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
test "multiple timezone" do
|
394
|
+
d = create_driver(%[
|
395
|
+
<grok>
|
396
|
+
pattern %{TIMESTAMP_ISO8601:time} 1 %{GREEDYDATA:message}
|
397
|
+
time_key time
|
398
|
+
time_format %Y-%m-%d %H:%M:%S
|
399
|
+
timezone Europe/Berlin
|
400
|
+
</grok>
|
401
|
+
<grok>
|
402
|
+
pattern %{TIMESTAMP_ISO8601:time} 2 %{GREEDYDATA:message}
|
403
|
+
time_key time
|
404
|
+
time_format %Y-%m-%d %H:%M:%S
|
405
|
+
timezone Asia/Aden
|
406
|
+
</grok>
|
407
|
+
])
|
408
|
+
d.instance.parse("2019-02-01 12:34:56 1 This is test") do |time, record|
|
409
|
+
assert_equal(event_time("2019-02-01 12:34:56 +0100"), time)
|
410
|
+
assert_equal({ "message" => "This is test" }, record)
|
411
|
+
end
|
412
|
+
d.instance.parse("2019-02-01 12:34:56 2 This is test") do |time, record|
|
413
|
+
assert_equal(event_time("2019-02-01 12:34:56 +0300"), time)
|
414
|
+
assert_equal({ "message" => "This is test" }, record)
|
415
|
+
end
|
416
|
+
end
|
350
417
|
end
|
351
418
|
|
352
419
|
private
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-grok-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kiyoto
|
8
8
|
- Kenji Okimoto
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-09-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
- - "<"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '2'
|
76
|
-
description:
|
76
|
+
description:
|
77
77
|
email:
|
78
78
|
- kiyoto@treasure-data.com
|
79
79
|
- okimoto@clear-code.com
|
@@ -123,7 +123,7 @@ homepage: https://github.com/fluent/fluent-plugin-grok-parser
|
|
123
123
|
licenses:
|
124
124
|
- Apache-2.0
|
125
125
|
metadata: {}
|
126
|
-
post_install_message:
|
126
|
+
post_install_message:
|
127
127
|
rdoc_options: []
|
128
128
|
require_paths:
|
129
129
|
- lib
|
@@ -138,9 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
requirements: []
|
141
|
-
|
142
|
-
|
143
|
-
signing_key:
|
141
|
+
rubygems_version: 3.1.2
|
142
|
+
signing_key:
|
144
143
|
specification_version: 4
|
145
144
|
summary: Fluentd plugin to support Logstash-inspired Grok format for parsing logs
|
146
145
|
test_files:
|