fluentd 0.10.22 → 0.10.23

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

data/ChangeLog CHANGED
@@ -1,4 +1,21 @@
1
1
 
2
+ Release 0.10.23 - 2012/06/25
3
+
4
+ * out_exec_filter: show more error messages when child process unexpectedly exited
5
+ * in_tail: Added 'apache2' format template which converts fields into integers or nil
6
+ * TextParser creates a parser instance for each output for proper configuration
7
+ * BufferedOutput: reset @flush_now flag
8
+ * changed default buffer limit parameters:
9
+ Fluentd core:
10
+ buffer_chunk_limit 256MB -> 8MB
11
+ buffer_queue_limit 128 -> 256
12
+ buf_memory:
13
+ buffer_chunk_limit 32MB -> 8MB
14
+ buffer_queue_limit 32 -> 64
15
+ out_file:
16
+ buffer_chunk_limit -> 256MB
17
+
18
+
2
19
  Release 0.10.22 - 2012/05/02
3
20
 
4
21
  * Fixed in_tail and TextParser not to raise "time_format is required" error
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.10.22
1
+ 0.10.23
@@ -127,8 +127,11 @@ class BasicBuffer < Buffer
127
127
  @parallel_pop = b
128
128
  end
129
129
 
130
- config_param :buffer_chunk_limit, :size, :default => 256*1024*1024
131
- config_param :buffer_queue_limit, :integer, :default => 128
130
+ # This configuration assumes plugins to send records to a remote server.
131
+ # Local file based plugins which should provide more reliability and efficiency
132
+ # should override buffer_chunk_limit with a larger size.
133
+ config_param :buffer_chunk_limit, :size, :default => 8*1024*1024
134
+ config_param :buffer_queue_limit, :integer, :default => 256
132
135
 
133
136
  alias chunk_limit buffer_chunk_limit
134
137
  alias chunk_limit= buffer_chunk_limit=
@@ -191,14 +194,16 @@ class BasicBuffer < Buffer
191
194
  nc << data
192
195
  chain.next
193
196
 
197
+ flush_trigger = false
194
198
  @queue.synchronize {
195
199
  enqueue(top)
200
+ flush_trigger = @queue.empty?
196
201
  @queue << top
197
202
  @map[key] = nc
198
203
  }
199
204
 
200
205
  ok = true
201
- return @queue.size == 1
206
+ return flush_trigger
202
207
  ensure
203
208
  nc.purge unless ok
204
209
  end
@@ -77,7 +77,6 @@ end
77
77
  class OutputThread
78
78
  def initialize(output)
79
79
  @output = output
80
- @flush_now = false
81
80
  @finish = false
82
81
  @next_time = Engine.now + 1.0
83
82
  end
@@ -102,7 +101,7 @@ class OutputThread
102
101
 
103
102
  def submit_flush
104
103
  @mutex.synchronize {
105
- @flush_now = true
104
+ @next_time = 0
106
105
  @cond.signal
107
106
  }
108
107
  Thread.pass
@@ -115,7 +114,7 @@ class OutputThread
115
114
  until @finish
116
115
  time = Engine.now
117
116
 
118
- if @flush_now || @next_time <= time
117
+ if @next_time <= time
119
118
  @mutex.unlock
120
119
  begin
121
120
  @next_time = @output.try_flush
@@ -84,24 +84,79 @@ class TextParser
84
84
  end
85
85
 
86
86
  return time, record
87
+ rescue Yajl::ParseError
88
+ # TODO?
89
+ return nil, nil
87
90
  end
88
91
  end
89
92
 
90
- TEMPLATES = {
91
- 'apache' => RegexpParser.new(/^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/, {'time_format'=>"%d/%b/%Y:%H:%M:%S %z"}),
92
- 'syslog' => RegexpParser.new(/^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/, {'time_format'=>"%b %d %H:%M:%S"}),
93
- 'json' => JSONParser.new,
93
+ class ApacheParser
94
+ include Configurable
95
+
96
+ REGEXP = /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
97
+
98
+ def call(text)
99
+ m = REGEXP.match(text)
100
+ unless m
101
+ $log.debug "pattern not match: #{text}"
102
+ return nil, nil
103
+ end
104
+
105
+ host = m['host']
106
+ host = (host == '-') ? nil : host
107
+
108
+ user = m['user']
109
+ user = (user == '-') ? nil : user
110
+
111
+ time = m['time']
112
+ time = Time.strptime(time, "%d/%b/%Y:%H:%M:%S %z").to_i
113
+
114
+ method = m['method']
115
+ path = m['path']
116
+
117
+ code = m['code'].to_i
118
+ code = nil if code == 0
119
+
120
+ size = m['size']
121
+ size = (size == '-') ? nil : size.to_i
122
+
123
+ referer = m['referer']
124
+ referer = (referer == '-') ? nil : referer
125
+
126
+ agent = m['agent']
127
+ agent = (agent == '-') ? nil : agent
128
+
129
+ record = {
130
+ "host" => host,
131
+ "user" => user,
132
+ "method" => method,
133
+ "path" => path,
134
+ "code" => code,
135
+ "size" => size,
136
+ "referer" => referer,
137
+ "agent" => agent,
138
+ }
139
+
140
+ return time, record
141
+ end
142
+ end
143
+
144
+ TEMPLATE_FACTORIES = {
145
+ 'apache' => Proc.new { RegexpParser.new(/^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/, {'time_format'=>"%d/%b/%Y:%H:%M:%S %z"}) },
146
+ 'apache2' => Proc.new { ApacheParser.new },
147
+ 'syslog' => Proc.new { RegexpParser.new(/^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/, {'time_format'=>"%b %d %H:%M:%S"}) },
148
+ 'json' => Proc.new { JSONParser.new },
94
149
  }
95
150
 
96
151
  def self.register_template(name, regexp_or_proc, time_format=nil)
97
152
  if regexp_or_proc.is_a?(Regexp)
98
- pr = regexp_or_proc
99
- else
100
153
  regexp = regexp_or_proc
101
- pr = RegexpParser.new(regexp, {'time_format'=>time_format})
154
+ factory = Proc.new { RegexpParser.new(regexp, {'time_format'=>time_format}) }
155
+ else
156
+ factory = Proc.new { regexp_or_proc }
102
157
  end
103
158
 
104
- TEMPLATES[name] = pr
159
+ TEMPLATE_FACTORIES[name] = factory
105
160
  end
106
161
 
107
162
  def initialize
@@ -134,10 +189,11 @@ class TextParser
134
189
 
135
190
  else
136
191
  # built-in template
137
- @parser = TEMPLATES[format]
138
- unless @parser
192
+ factory = TEMPLATE_FACTORIES[format]
193
+ unless factory
139
194
  raise ConfigError, "Unknown format template '#{format}'"
140
195
  end
196
+ @parser = factory.call
141
197
  end
142
198
 
143
199
  if @parser.respond_to?(:configure)
@@ -0,0 +1,159 @@
1
+ #
2
+ # Fluent
3
+ #
4
+ # Copyright (C) 2011 FURUHASHI Sadayuki
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module Fluent
19
+
20
+
21
+ class TextParser
22
+ class RegexpParser
23
+ include Configurable
24
+
25
+ config_param :time_format, :string, :default => nil
26
+
27
+ def initialize(regexp, conf={})
28
+ super()
29
+ @regexp = regexp
30
+ unless conf.empty?
31
+ configure(conf)
32
+ end
33
+ end
34
+
35
+ def call(text)
36
+ m = @regexp.match(text)
37
+ unless m
38
+ $log.debug "pattern not match: #{text}"
39
+ # TODO?
40
+ return nil, nil
41
+ end
42
+
43
+ time = nil
44
+ record = {}
45
+
46
+ m.names.each {|name|
47
+ if value = m[name]
48
+ case name
49
+ when "time"
50
+ if @time_format
51
+ time = Time.strptime(value, @time_format).to_i
52
+ else
53
+ time = Time.parse(value).to_i
54
+ end
55
+ else
56
+ record[name] = value
57
+ end
58
+ end
59
+ }
60
+
61
+ time ||= Engine.now
62
+
63
+ return time, record
64
+ end
65
+ end
66
+
67
+ class JSONParser
68
+ include Configurable
69
+
70
+ config_param :time_key, :string, :default => 'time'
71
+ config_param :time_format, :string, :default => nil
72
+
73
+ def call(text)
74
+ record = Yajl.load(text)
75
+
76
+ if value = record.delete(@time_key)
77
+ if @time_format
78
+ time = Time.strptime(value, @time_format).to_i
79
+ else
80
+ time = value.to_i
81
+ end
82
+ else
83
+ time = Engine.now
84
+ end
85
+
86
+ return time, record
87
+ rescue Yajl::ParseError
88
+ # TODO?
89
+ return nil, nil
90
+ end
91
+ end
92
+
93
+ TEMPLATES = {
94
+ 'apache' => RegexpParser.new(/^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/, {'time_format'=>"%d/%b/%Y:%H:%M:%S %z"}),
95
+ 'syslog' => RegexpParser.new(/^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/, {'time_format'=>"%b %d %H:%M:%S"}),
96
+ 'json' => JSONParser.new,
97
+ }
98
+
99
+ def self.register_template(name, regexp_or_proc, time_format=nil)
100
+ if regexp_or_proc.is_a?(Regexp)
101
+ regexp = regexp_or_proc
102
+ pr = RegexpParser.new(regexp, {'time_format'=>time_format})
103
+ else
104
+ pr = regexp_or_proc
105
+ end
106
+
107
+ TEMPLATES[name] = pr
108
+ end
109
+
110
+ def initialize
111
+ @parser = nil
112
+ end
113
+
114
+ def configure(conf, required=true)
115
+ format = conf['format']
116
+
117
+ if format == nil
118
+ if required
119
+ raise ConfigError, "'format' parameter is required"
120
+ else
121
+ return nil
122
+ end
123
+ end
124
+
125
+ if format[0] == ?/ && format[format.length-1] == ?/
126
+ # regexp
127
+ begin
128
+ regexp = Regexp.new(format[1..-2])
129
+ if regexp.named_captures.empty?
130
+ raise "No named captures"
131
+ end
132
+ rescue
133
+ raise ConfigError, "Invalid regexp '#{format[1..-2]}': #{$!}"
134
+ end
135
+
136
+ @parser = RegexpParser.new(regexp)
137
+
138
+ else
139
+ # built-in template
140
+ @parser = TEMPLATES[format]
141
+ unless @parser
142
+ raise ConfigError, "Unknown format template '#{format}'"
143
+ end
144
+ end
145
+
146
+ if @parser.respond_to?(:configure)
147
+ @parser.configure(conf)
148
+ end
149
+
150
+ return true
151
+ end
152
+
153
+ def parse(text)
154
+ return @parser.call(text)
155
+ end
156
+ end
157
+
158
+
159
+ end
@@ -0,0 +1,91 @@
1
+ ***************
2
+ *** 90,107 ****
3
+ end
4
+ end
5
+
6
+ TEMPLATES = {
7
+ - 'apache' => RegexpParser.new(/^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/, {'time_format'=>"%d/%b/%Y:%H:%M:%S %z"}),
8
+ - 'syslog' => RegexpParser.new(/^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/, {'time_format'=>"%b %d %H:%M:%S"}),
9
+ - 'json' => JSONParser.new,
10
+ }
11
+
12
+ def self.register_template(name, regexp_or_proc, time_format=nil)
13
+ if regexp_or_proc.is_a?(Regexp)
14
+ - pr = regexp_or_proc
15
+ else
16
+ regexp = regexp_or_proc
17
+ - pr = RegexpParser.new(regexp, {'time_format'=>time_format})
18
+ end
19
+
20
+ TEMPLATES[name] = pr
21
+ --- 90,159 ----
22
+ end
23
+ end
24
+
25
+ + class ApacheParser
26
+ + include Configurable
27
+ +
28
+ + REGEXP = /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
29
+ +
30
+ + def call(text)
31
+ + m = REGEXP.match(text)
32
+ + unless m
33
+ + $log.debug "pattern not match: #{text}"
34
+ + return nil, nil
35
+ + end
36
+ +
37
+ + host = m['host']
38
+ + host = (host == '-') ? nil : host
39
+ +
40
+ + user = m['user']
41
+ + user = (user == '-') ? nil : user
42
+ +
43
+ + time = m['time']
44
+ + time = Time.strptime(time, "%d/%b/%Y:%H:%M:%S %z").to_i
45
+ +
46
+ + method = m['method']
47
+ + path = m['path']
48
+ +
49
+ + code = m['code'].to_i
50
+ + code = nil if code == 0
51
+ +
52
+ + size = m['size']
53
+ + size = (size == '-') ? nil : size.to_i
54
+ +
55
+ + referer = m['referer']
56
+ + referer = (referer == '-') ? nil : referer
57
+ +
58
+ + agent = m['agent']
59
+ + agent = (agent == '-') ? nil : agent
60
+ +
61
+ + record = {
62
+ + "host" => host,
63
+ + "user" => user,
64
+ + "method" => method,
65
+ + "path" => path,
66
+ + "code" => code,
67
+ + "size" => size,
68
+ + "referer" => referer,
69
+ + "agent" => agent,
70
+ + }
71
+ +
72
+ + return time, record
73
+ + end
74
+ + end
75
+ +
76
+ TEMPLATES = {
77
+ + 'apache' => Proc.new { RegexpParser.new(/^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/, {'time_format'=>"%d/%b/%Y:%H:%M:%S %z"}) },
78
+ + 'apache2' => Proc.new { ApacheParser.new },
79
+ + 'syslog' => Proc.new { RegexpParser.new(/^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/, {'time_format'=>"%b %d %H:%M:%S"}) },
80
+ + 'json' => Proc.new { JSONParser.new },
81
+ }
82
+
83
+ def self.register_template(name, regexp_or_proc, time_format=nil)
84
+ if regexp_or_proc.is_a?(Regexp)
85
+ + pr = Proc.new { regexp_or_proc }
86
+ else
87
+ regexp = regexp_or_proc
88
+ + pr = Proc.new { RegexpParser.new(regexp, {'time_format'=>time_format}) }
89
+ end
90
+
91
+ TEMPLATES[name] = pr
@@ -68,9 +68,9 @@ class MemoryBuffer < BasicBuffer
68
68
  super
69
69
  end
70
70
 
71
- # overwrite default buffer_chunk_limit and buffer_queue_limit
72
- config_set_default :buffer_chunk_limit, 32*1024*1024
73
- config_set_default :buffer_queue_limit, 32
71
+ # Overwrite default BasicBuffer#buffer_queue_limit
72
+ # to limit total memory usage upto 512MB.
73
+ config_set_default :buffer_queue_limit, 64
74
74
 
75
75
  def configure(conf)
76
76
  super
@@ -221,13 +221,16 @@ class ExecFilterOutput < BufferedOutput
221
221
  end
222
222
 
223
223
  def start(command)
224
+ @command = command
224
225
  @io = IO.popen(command, "r+")
225
226
  @pid = @io.pid
226
227
  @io.sync = true
228
+ @finished = false
227
229
  @thread = Thread.new(&method(:run))
228
230
  end
229
231
 
230
232
  def shutdown
233
+ @finished = true
231
234
  begin
232
235
  Process.kill(:TERM, @pid)
233
236
  rescue Errno::ESRCH
@@ -259,10 +262,13 @@ class ExecFilterOutput < BufferedOutput
259
262
  def run
260
263
  @parser.call(@io)
261
264
  rescue
262
- $log.error "exec_filter process exited", :error=>$!.to_s
265
+ $log.error "exec_filter thread unexpectedly failed with an error.", :command=>@command, :error=>$!.to_s
263
266
  $log.warn_backtrace $!.backtrace
264
267
  ensure
265
- Process.waitpid(@pid)
268
+ pid, stat = Process.waitpid2(@pid)
269
+ unless @finished
270
+ $log.error "exec_filter process unexpectedly exited.", :command=>@command, :ecode=>stat.to_i
271
+ end
266
272
  end
267
273
  end
268
274
 
@@ -62,6 +62,9 @@ class FileOutput < TimeSlicedOutput
62
62
  conf['buffer_path'] ||= "#{@path}.*"
63
63
  end
64
64
 
65
+ # override default buffer_chunk_limit
66
+ conf['buffer_chunk_limit'] ||= '256m'
67
+
65
68
  super
66
69
 
67
70
  @timef = TimeFormatter.new(@time_format, @localtime)
@@ -1,5 +1,5 @@
1
1
  module Fluent
2
2
 
3
- VERSION = '0.10.22'
3
+ VERSION = '0.10.23'
4
4
 
5
5
  end
@@ -115,7 +115,7 @@ class ExecFilterOutputTest < Test::Unit::TestCase
115
115
  assert_equal ["xxx", time, {"val2"=>"sed-ed value foo"}], emits[0]
116
116
 
117
117
  d = create_driver %[
118
- command sed -l -e s/foo/bar/
118
+ command sed --unbuffered -l -e s/foo/bar/
119
119
  in_keys time,val1
120
120
  out_keys time,val2
121
121
  tag xxx
@@ -138,7 +138,7 @@ class ExecFilterOutputTest < Test::Unit::TestCase
138
138
 
139
139
  def test_emit_4
140
140
  d = create_driver(%[
141
- command sed -l -e s/foo/bar/
141
+ command sed --unbuffered -l -e s/foo/bar/
142
142
  in_keys tag,time,val1
143
143
  remove_prefix input
144
144
  out_keys tag,time,val2
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluentd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.22
4
+ version: 0.10.23
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-02 00:00:00.000000000Z
12
+ date: 2012-06-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &70252881832620 !ruby/object:Gem::Requirement
16
+ requirement: &70230576091380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70252881832620
24
+ version_requirements: *70230576091380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70252881832140 !ruby/object:Gem::Requirement
27
+ requirement: &70230576090780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70252881832140
35
+ version_requirements: *70230576090780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yajl-ruby
38
- requirement: &70252881831560 !ruby/object:Gem::Requirement
38
+ requirement: &70230576090240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '1.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70252881831560
46
+ version_requirements: *70230576090240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cool.io
49
- requirement: &70252881831080 !ruby/object:Gem::Requirement
49
+ requirement: &70230576089620 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70252881831080
57
+ version_requirements: *70230576089620
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: http_parser.rb
60
- requirement: &70252881830600 !ruby/object:Gem::Requirement
60
+ requirement: &70230576088920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.5.1
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70252881830600
68
+ version_requirements: *70230576088920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
- requirement: &70252881830080 !ruby/object:Gem::Requirement
71
+ requirement: &70230576088280 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.9.2
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70252881830080
79
+ version_requirements: *70230576088280
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rr
82
- requirement: &70252881829500 !ruby/object:Gem::Requirement
82
+ requirement: &70230576087680 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 1.0.0
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70252881829500
90
+ version_requirements: *70230576087680
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: timecop
93
- requirement: &70252881828920 !ruby/object:Gem::Requirement
93
+ requirement: &70230576087040 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.3.0
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70252881828920
101
+ version_requirements: *70230576087040
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: jeweler
104
- requirement: &70252881828380 !ruby/object:Gem::Requirement
104
+ requirement: &70230576086400 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 1.0.0
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70252881828380
112
+ version_requirements: *70230576086400
113
113
  description:
114
114
  email: frsyuki@gmail.com
115
115
  executables:
@@ -145,6 +145,8 @@ files:
145
145
  - lib/fluent/mixin.rb
146
146
  - lib/fluent/output.rb
147
147
  - lib/fluent/parser.rb
148
+ - lib/fluent/parser.rb.orig
149
+ - lib/fluent/parser.rb.rej
148
150
  - lib/fluent/plugin.rb
149
151
  - lib/fluent/plugin/buf_file.rb
150
152
  - lib/fluent/plugin/buf_memory.rb