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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ee0a491eb3c582a83f228c34648869c693cf028aba0beed0404f0ffa3dff182
4
- data.tar.gz: b421584afadea006497e075a5e198bbd2497654cb446148e1223320172a85aac
3
+ metadata.gz: 9a5f5cd1dd1aa1de7edd4425755616b0488492d32847b8e254d79d0385d3cbd4
4
+ data.tar.gz: cc629c894253715304a18b3eccc2a2caba04069b9b22124893a8e77dacbf4c44
5
5
  SHA512:
6
- metadata.gz: 0db5d145e6d33b285393c75a8383b93120ba623f99859356831e2b08622ca8d1c12ac37d9597ea5fc123d2997c7d42d6b75f4015e9502eaccc830fe41a1919db
7
- data.tar.gz: 55d52fd681a761529947a779ebec12de1b7468e1d95546b086fd34d1dcaba6a4122726a954ddbc2f26cd872ca401ec0d6a4ce1294118b8db4bc48a47df79fade
6
+ metadata.gz: 7548442e6f18c3b302df37f9f8d9300374f116236fcecb30c8e2426e65f43038e011a312ff4641d779c26fd95f6f3d38db17145ea793a2a29f34b2ab7c6d0709
7
+ data.tar.gz: b5e05fbefb609cf206ddbbf8347a9e9f93e4ba4a4eb2aa1d653db6b54332c311b4c388d8cf7e85fad2d10919d444a2bb6a5fe7677024f999d43cfd7680785b9c
@@ -2,8 +2,6 @@ sudo: false
2
2
  language: ruby
3
3
 
4
4
  rvm:
5
- - 2.2.10
6
- - 2.3.7
7
- - 2.4.4
8
- - 2.5.1
9
-
5
+ - 2.4
6
+ - 2.5.3
7
+ - 2.6.0
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: [TimeParameters Plugin Overview](https://docs.fluentd.org/v1.0/articles/timeparameters-plugin-overview)
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](http://docs.fluentd.org/articles/plugin-management#plugin-version-management)
306
+ See also: [Plugin Management | Fluentd](https://docs.fluentd.org/deployment/plugin-management)
275
307
 
276
308
  ## License
277
309
 
@@ -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
- - IF %ridk%==0 bundle install
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.4.0"
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}
@@ -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!(m[0]) do |s|
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
@@ -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]+(\+[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|INFO|[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)?)
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)?)
@@ -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
 
@@ -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})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
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}\]( \(%{POSINT:proxy_errorcode}\)%{DATA:proxy_message}:)?( \[client %{IPORHOST:clientip}:%{POSINT:clientport}\])? %{DATA:errorcode}: %{GREEDYDATA:message}
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}
@@ -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 (?:[A-Za-z0-9_. -]+)
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)
@@ -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}|-) +(?:%{HOSTNAME:syslog5424_host}|-) +(-|%{SYSLOG5424PRINTASCII:syslog5424_app}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_proc}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_msgid}) +(?:%{SYSLOG5424SD:syslog5424_sd}|-|)
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}
@@ -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};%{DATA:nagios_unknown1};%{DATA:nagios_unknown2}
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
@@ -158,37 +158,49 @@ class GrokParserTest < ::Test::Unit::TestCase
158
158
  end
159
159
  end
160
160
 
161
- test "no grok patterns" do
162
- assert_raise Fluent::ConfigError do
163
- create_driver('')
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
- test "invalid config value type" do
168
- assert_raise Fluent::ConfigError do
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
- test "invalid config value type and normal grok pattern" do
178
- d = create_driver(%[
179
- <grok>
180
- pattern %{PATH:path:foo}
181
- </grok>
182
- <grok>
183
- pattern %{IP:ip_address}
184
- </grok>
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.0
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: 2018-11-28 00:00:00.000000000 Z
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
- rubyforge_project:
142
- rubygems_version: 2.7.6
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: