fluent-plugin-grok-parser 2.4.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: