fluent-plugin-grok-parser 1.0.1 → 2.0.0
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 +5 -5
- data/README.md +79 -5
- data/Rakefile +2 -38
- data/fluent-plugin-grok-parser.gemspec +2 -2
- data/lib/fluent/plugin/grok.rb +1 -1
- data/lib/fluent/plugin/parser_grok.rb +11 -30
- data/lib/fluent/plugin/parser_multiline_grok.rb +8 -18
- data/patterns/aws +3 -3
- data/test/helper.rb +2 -0
- data/test/test_grok_parser.rb +2 -12
- data/test/test_grok_parser_in_tcp.rb +7 -8
- data/test/test_multiline_grok_parser.rb +3 -3
- metadata +5 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c95b3d25597cea368b25f55f45c222a373097ea
|
4
|
+
data.tar.gz: b42a68ae28f5ffd37bc9be15b511fc0a0d34fcce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64f5933dfbee0819f2a26c63a5fd6c586c9013dbead10f7df0af1d9761f56a66545e808cc06493e987b13d0b5fc4ff8d20bd7c9bc46742c0e4d5c23da5d71434
|
7
|
+
data.tar.gz: 971aeca2d5f7fb2f8c88ffb8370414f67beab55697218d0504ed2997d3a2b117ff73412ae41045e0f82007ad3e38c51cb9889618f516616999c6c52f78e86ac9
|
data/README.md
CHANGED
@@ -17,9 +17,23 @@ extracts the first IP address that matches in the log.
|
|
17
17
|
<source>
|
18
18
|
@type tail
|
19
19
|
path /path/to/log
|
20
|
+
tag grokked_log
|
21
|
+
<parse>
|
22
|
+
@type grok
|
23
|
+
grok_pattern %{IP:ip_address}
|
24
|
+
</parse>
|
25
|
+
</source>
|
26
|
+
```
|
27
|
+
|
28
|
+
You can also use Fluentd v0.12 style:
|
29
|
+
|
30
|
+
```aconf
|
31
|
+
<source>
|
32
|
+
@type tail
|
33
|
+
path /path/to/log
|
34
|
+
tag grokked_log
|
20
35
|
format grok
|
21
36
|
grok_pattern %{IP:ip_address}
|
22
|
-
tag grokked_log
|
23
37
|
</source>
|
24
38
|
```
|
25
39
|
|
@@ -29,6 +43,30 @@ extracts the first IP address that matches in the log.
|
|
29
43
|
<source>
|
30
44
|
@type tail
|
31
45
|
path /path/to/log
|
46
|
+
tag grokked_log
|
47
|
+
<parse>
|
48
|
+
@type grok
|
49
|
+
<grok>
|
50
|
+
pattern %{COMBINEDAPACHELOG}
|
51
|
+
time_format "%d/%b/%Y:%H:%M:%S %z"
|
52
|
+
</grok>
|
53
|
+
<grok>
|
54
|
+
pattern %{IP:ip_address}
|
55
|
+
</grok>
|
56
|
+
<grok>
|
57
|
+
pattern %{GREEDYDATA:message}
|
58
|
+
</grok>
|
59
|
+
</parse>
|
60
|
+
</source>
|
61
|
+
```
|
62
|
+
|
63
|
+
You can also use Fluentd v0.12 style:
|
64
|
+
|
65
|
+
```aconf
|
66
|
+
<source>
|
67
|
+
@type tail
|
68
|
+
path /path/to/log
|
69
|
+
tag grokked_log
|
32
70
|
format grok
|
33
71
|
<grok>
|
34
72
|
pattern %{COMBINEDAPACHELOG}
|
@@ -40,7 +78,6 @@ extracts the first IP address that matches in the log.
|
|
40
78
|
<grok>
|
41
79
|
pattern %{GREEDYDATA:message}
|
42
80
|
</grok>
|
43
|
-
tag grokked_log
|
44
81
|
</source>
|
45
82
|
```
|
46
83
|
|
@@ -48,6 +85,21 @@ extracts the first IP address that matches in the log.
|
|
48
85
|
|
49
86
|
You can parse multiple line text.
|
50
87
|
|
88
|
+
```aconf
|
89
|
+
<source>
|
90
|
+
@type tail
|
91
|
+
path /path/to/log
|
92
|
+
tag grokked_log
|
93
|
+
<parse>
|
94
|
+
@type multiline_grok
|
95
|
+
grok_pattern %{IP:ip_address}%{GREEDYDATA:message}
|
96
|
+
multiline_start_regexp /^[^\s]/
|
97
|
+
</parse>
|
98
|
+
</source>
|
99
|
+
```
|
100
|
+
|
101
|
+
You can also use Fluentd v0.12 style:
|
102
|
+
|
51
103
|
```aconf
|
52
104
|
<source>
|
53
105
|
@type tail
|
@@ -61,6 +113,22 @@ You can parse multiple line text.
|
|
61
113
|
|
62
114
|
You can use multiple grok patterns to parse your data.
|
63
115
|
|
116
|
+
```aconf
|
117
|
+
<source>
|
118
|
+
@type tail
|
119
|
+
path /path/to/log
|
120
|
+
tag grokked_log
|
121
|
+
<parse>
|
122
|
+
@type multiline_grok
|
123
|
+
<grok>
|
124
|
+
pattern Started %{WORD:verb} "%{URIPATH:pathinfo}" for %{IP:ip} at %{TIMESTAMP_ISO8601:timestamp}\nProcessing by %{WORD:controller}#%{WORD:action} as %{WORD:format}%{DATA:message}Completed %{NUMBER:response} %{WORD} in %{NUMBER:elapsed} (%{DATA:elapsed_details})
|
125
|
+
</grok>
|
126
|
+
</parse>
|
127
|
+
</source>
|
128
|
+
```
|
129
|
+
|
130
|
+
You can also use Fluentd v0.12 style:
|
131
|
+
|
64
132
|
```aconf
|
65
133
|
<source>
|
66
134
|
@type tail
|
@@ -105,9 +173,11 @@ This is what the `custom_pattern_path` parameter is for.
|
|
105
173
|
<source>
|
106
174
|
@type tail
|
107
175
|
path /path/to/log
|
108
|
-
|
109
|
-
|
110
|
-
|
176
|
+
<parse>
|
177
|
+
@type grok
|
178
|
+
grok_pattern %{MY_SUPER_PATTERN}
|
179
|
+
custom_pattern_path /path/to/my_pattern
|
180
|
+
</parse>
|
111
181
|
</source>
|
112
182
|
```
|
113
183
|
|
@@ -158,6 +228,10 @@ Here is a sample config using the Grok parser with `in_tail` and the `types` par
|
|
158
228
|
</source>
|
159
229
|
```
|
160
230
|
|
231
|
+
## Notice
|
232
|
+
|
233
|
+
If you want to use this plugin with Fluentd v0.12.x or earlier, you can use this plugin version v1.0.0.
|
234
|
+
|
161
235
|
## License
|
162
236
|
|
163
237
|
Apache 2.0 License
|
data/Rakefile
CHANGED
@@ -9,8 +9,8 @@ desc 'Run test_unit based test'
|
|
9
9
|
Rake::TestTask.new(:base_test) do |t|
|
10
10
|
t.libs << "test"
|
11
11
|
t.test_files = (Dir["test/test_*.rb"] + Dir["test/plugin/test_*.rb"] - ["helper.rb"]).sort
|
12
|
-
t.verbose =
|
13
|
-
t.warning = false
|
12
|
+
t.verbose = true
|
13
|
+
# t.warning = false
|
14
14
|
end
|
15
15
|
|
16
16
|
desc 'Import patterns from submodules'
|
@@ -20,42 +20,6 @@ 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
|
59
23
|
end
|
60
24
|
|
61
25
|
task :default => [:test, :build]
|
@@ -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 = "
|
7
|
+
spec.version = "2.0.0"
|
8
8
|
spec.authors = ["kiyoto"]
|
9
9
|
spec.email = ["kiyoto@treasure-data.com"]
|
10
10
|
spec.summary = %q{Fluentd plugin to support Logstash-inspired Grok format for parsing logs}
|
@@ -19,5 +19,5 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_development_dependency "bundler"
|
20
20
|
spec.add_development_dependency "rake"
|
21
21
|
spec.add_development_dependency "test-unit", ">=3.1.5"
|
22
|
-
spec.add_runtime_dependency "fluentd",
|
22
|
+
spec.add_runtime_dependency "fluentd", ">=0.14.6"
|
23
23
|
end
|
data/lib/fluent/plugin/grok.rb
CHANGED
@@ -82,7 +82,7 @@ module Fluent
|
|
82
82
|
replacement_pattern = "(?<#{m["subname"]}>#{curr_pattern})"
|
83
83
|
type_map[m["subname"]] = m["type"] || "string"
|
84
84
|
else
|
85
|
-
replacement_pattern =
|
85
|
+
replacement_pattern = curr_pattern
|
86
86
|
end
|
87
87
|
pattern.sub!(m[0]) do |s| replacement_pattern end
|
88
88
|
end
|
@@ -1,19 +1,11 @@
|
|
1
1
|
require "fluent/plugin/grok"
|
2
2
|
|
3
3
|
module Fluent
|
4
|
-
|
4
|
+
module Plugin
|
5
5
|
class GrokPatternNotFoundError < Exception; end
|
6
6
|
|
7
7
|
class GrokParser < Parser
|
8
|
-
Plugin.register_parser('grok', self)
|
9
|
-
|
10
|
-
# For fluentd v0.12.16 or earlier
|
11
|
-
class << self
|
12
|
-
unless method_defined?(:desc)
|
13
|
-
def desc(description)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
8
|
+
Fluent::Plugin.register_parser('grok', self)
|
17
9
|
|
18
10
|
desc 'The format of the time field.'
|
19
11
|
config_param :time_format, :string, :default => nil
|
@@ -38,11 +30,11 @@ module Fluent
|
|
38
30
|
end
|
39
31
|
|
40
32
|
if @custom_pattern_path
|
41
|
-
if Dir.
|
33
|
+
if Dir.exist? @custom_pattern_path
|
42
34
|
Dir.glob(@custom_pattern_path + '/*') do |pattern_file_path|
|
43
35
|
@grok.add_patterns_from_file(pattern_file_path)
|
44
36
|
end
|
45
|
-
elsif File.
|
37
|
+
elsif File.exist? @custom_pattern_path
|
46
38
|
@grok.add_patterns_from_file(@custom_pattern_path)
|
47
39
|
end
|
48
40
|
end
|
@@ -50,27 +42,16 @@ module Fluent
|
|
50
42
|
@grok.setup
|
51
43
|
end
|
52
44
|
|
53
|
-
def parse(text
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
return
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
yield @default_parser.parse(text)
|
64
|
-
else
|
65
|
-
@grok.parsers.each do |parser|
|
66
|
-
parser.parse(text) do |time, record|
|
67
|
-
if time and record
|
68
|
-
return time, record
|
69
|
-
end
|
45
|
+
def parse(text)
|
46
|
+
@grok.parsers.each do |parser|
|
47
|
+
parser.parse(text) do |time, record|
|
48
|
+
if time and record
|
49
|
+
yield time, record
|
50
|
+
return
|
70
51
|
end
|
71
52
|
end
|
72
|
-
return @default_parser.parse(text)
|
73
53
|
end
|
54
|
+
yield @default_parser.parse(text)
|
74
55
|
end
|
75
56
|
end
|
76
57
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'fluent/plugin/parser_grok'
|
2
2
|
|
3
3
|
module Fluent
|
4
|
-
|
4
|
+
module Plugin
|
5
5
|
class MultilineGrokParser < GrokParser
|
6
|
-
Plugin.register_parser('multiline_grok', self)
|
6
|
+
Fluent::Plugin.register_parser('multiline_grok', self)
|
7
7
|
|
8
8
|
desc 'The regexp to match beginning of multiline'
|
9
9
|
config_param :multiline_start_regexp, :string, :default => nil
|
@@ -24,22 +24,12 @@ module Fluent
|
|
24
24
|
@multiline_start_regexp && !!@grok.multiline_start_regexp.match(text)
|
25
25
|
end
|
26
26
|
|
27
|
-
def parse(text
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
return
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
else
|
38
|
-
@grok.parsers.each do |parser|
|
39
|
-
parser.parse(text) do |time, record|
|
40
|
-
if time and record
|
41
|
-
return time, record
|
42
|
-
end
|
27
|
+
def parse(text)
|
28
|
+
@grok.parsers.each do |parser|
|
29
|
+
parser.parse(text) do |time, record|
|
30
|
+
if time and record
|
31
|
+
yield time, record
|
32
|
+
return
|
43
33
|
end
|
44
34
|
end
|
45
35
|
end
|
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:int}|-) (?:-|%{NOTSPACE:error_code}) (?:%{INT:bytes:int}|-) (?:%{INT:object_size:int}|-) (?:%{INT:request_time_ms:int}|-) (?:%{INT:turnaround_time_ms:int}|-) (?:%{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:int} (?:(%{IP:backendip}:?:%{INT:backendport:int})|-) %{NUMBER:request_processing_time:float} %{NUMBER:backend_processing_time:float} %{NUMBER:response_processing_time:float} %{INT:response:int} %{INT:backend_response:int} %{INT:received_bytes:int} %{INT:bytes:int} "%{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:int}|-)\t%{IPORHOST:clientip}\t%{WORD:cs_method}\t%{HOSTNAME:cs_host}\t%{NOTSPACE:cs_uri_stem}\t%{NUMBER:sc_status:int}\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:int}\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/test/helper.rb
CHANGED
data/test/test_grok_parser.rb
CHANGED
@@ -37,11 +37,6 @@ class GrokParserTest < ::Test::Unit::TestCase
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
def test_date
|
41
|
-
internal_test_grok_pattern("\\[(?<date>%{DATE} %{TIME} (?:AM|PM))\\]", "[2/16/2018 10:19:34 AM]",
|
42
|
-
nil, { "date" => "2/16/2018 10:19:34 AM" })
|
43
|
-
end
|
44
|
-
|
45
40
|
def test_call_for_grok_pattern_not_found
|
46
41
|
assert_raise Grok::GrokPatternNotFoundError do
|
47
42
|
internal_test_grok_pattern('%{THIS_PATTERN_DOESNT_EXIST}', 'Some stuff at somewhere', nil, {})
|
@@ -135,15 +130,10 @@ class GrokParserTest < ::Test::Unit::TestCase
|
|
135
130
|
private
|
136
131
|
|
137
132
|
def internal_test_grok_pattern(grok_pattern, text, expected_time, expected_record, options = {})
|
138
|
-
|
139
|
-
|
140
|
-
# for the old, return based API
|
141
|
-
time, record = parser.parse(text)
|
142
|
-
assert_equal(expected_time, time) if expected_time
|
143
|
-
assert_equal(expected_record, record)
|
133
|
+
d = Fluent::Test::Driver::Parser.new(Fluent::Plugin::GrokParser).configure({"grok_pattern" => grok_pattern}.merge(options))
|
144
134
|
|
145
135
|
# for the new API
|
146
|
-
|
136
|
+
d.instance.parse(text) {|time, record|
|
147
137
|
assert_equal(expected_time, time) if expected_time
|
148
138
|
assert_equal(expected_record, record)
|
149
139
|
}
|
@@ -35,7 +35,7 @@ class TcpInputWithGrokTest < Test::Unit::TestCase
|
|
35
35
|
]
|
36
36
|
|
37
37
|
def create_driver(conf)
|
38
|
-
Fluent::Test::
|
38
|
+
Fluent::Test::Driver::Input.new(Fluent::TcpInput).configure(conf)
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_configure
|
@@ -83,22 +83,21 @@ class TcpInputWithGrokTest < Test::Unit::TestCase
|
|
83
83
|
|
84
84
|
def internal_test_grok(conf, tests)
|
85
85
|
d = create_driver(BASE_CONFIG + conf)
|
86
|
-
d.run do
|
86
|
+
d.run(expect_emits: tests.size) do
|
87
87
|
tests.each {|test|
|
88
88
|
TCPSocket.open('127.0.0.1', PORT) do |s|
|
89
89
|
s.send(test['msg'], 0)
|
90
90
|
end
|
91
91
|
}
|
92
|
-
sleep 1
|
93
92
|
end
|
94
93
|
|
95
|
-
compare_test_result(d.
|
94
|
+
compare_test_result(d.events, tests)
|
96
95
|
end
|
97
96
|
|
98
|
-
def compare_test_result(
|
99
|
-
assert_equal(2,
|
100
|
-
|
101
|
-
assert_equal(tests[i]['expected'],
|
97
|
+
def compare_test_result(events, tests)
|
98
|
+
assert_equal(2, events.size)
|
99
|
+
events.each_index {|i|
|
100
|
+
assert_equal(tests[i]['expected'], events[i][2]['message'])
|
102
101
|
}
|
103
102
|
end
|
104
103
|
end
|
@@ -21,7 +21,7 @@ MESSAGE
|
|
21
21
|
]
|
22
22
|
d = create_driver(conf)
|
23
23
|
|
24
|
-
d.parse(text) do |
|
24
|
+
d.instance.parse(text) do |_time, record|
|
25
25
|
assert_equal({ "hostname" => "host1", "message" => message }, record)
|
26
26
|
end
|
27
27
|
end
|
@@ -44,7 +44,7 @@ TEXT
|
|
44
44
|
"message2" => "message2",
|
45
45
|
"message3" => "message3"
|
46
46
|
}
|
47
|
-
d.parse(text) do |
|
47
|
+
d.instance.parse(text) do |_time, record|
|
48
48
|
assert_equal(expected, record)
|
49
49
|
end
|
50
50
|
end
|
@@ -63,6 +63,6 @@ TEXT
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def create_driver(conf)
|
66
|
-
Fluent::Test::
|
66
|
+
Fluent::Test::Driver::Parser.new(Fluent::Plugin::MultilineGrokParser).configure(conf)
|
67
67
|
end
|
68
68
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-grok-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kiyoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,20 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
62
|
-
- - "~>"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 0.12.0
|
61
|
+
version: 0.14.6
|
65
62
|
type: :runtime
|
66
63
|
prerelease: false
|
67
64
|
version_requirements: !ruby/object:Gem::Requirement
|
68
65
|
requirements:
|
69
66
|
- - ">="
|
70
67
|
- !ruby/object:Gem::Version
|
71
|
-
version: 0.
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: 0.12.0
|
68
|
+
version: 0.14.6
|
75
69
|
description:
|
76
70
|
email:
|
77
71
|
- kiyoto@treasure-data.com
|
@@ -135,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
129
|
version: '0'
|
136
130
|
requirements: []
|
137
131
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.
|
132
|
+
rubygems_version: 2.6.4
|
139
133
|
signing_key:
|
140
134
|
specification_version: 4
|
141
135
|
summary: Fluentd plugin to support Logstash-inspired Grok format for parsing logs
|