fluent-plugin-grok-parser 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|