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 +17 -0
- data/VERSION +1 -1
- data/lib/fluent/buffer.rb +8 -3
- data/lib/fluent/output.rb +2 -3
- data/lib/fluent/parser.rb +66 -10
- data/lib/fluent/parser.rb.orig +159 -0
- data/lib/fluent/parser.rb.rej +91 -0
- data/lib/fluent/plugin/buf_memory.rb +3 -3
- data/lib/fluent/plugin/out_exec_filter.rb +8 -2
- data/lib/fluent/plugin/out_file.rb +3 -0
- data/lib/fluent/version.rb +1 -1
- data/test/plugin/out_exec_filter.rb +2 -2
- metadata +22 -20
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.
|
1
|
+
0.10.23
|
data/lib/fluent/buffer.rb
CHANGED
@@ -127,8 +127,11 @@ class BasicBuffer < Buffer
|
|
127
127
|
@parallel_pop = b
|
128
128
|
end
|
129
129
|
|
130
|
-
|
131
|
-
|
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
|
206
|
+
return flush_trigger
|
202
207
|
ensure
|
203
208
|
nc.purge unless ok
|
204
209
|
end
|
data/lib/fluent/output.rb
CHANGED
@@ -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
|
-
@
|
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 @
|
117
|
+
if @next_time <= time
|
119
118
|
@mutex.unlock
|
120
119
|
begin
|
121
120
|
@next_time = @output.try_flush
|
data/lib/fluent/parser.rb
CHANGED
@@ -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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
138
|
-
unless
|
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
|
-
#
|
72
|
-
|
73
|
-
config_set_default :buffer_queue_limit,
|
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
|
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.
|
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
|
|
data/lib/fluent/version.rb
CHANGED
@@ -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.
|
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-
|
12
|
+
date: 2012-06-26 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: msgpack
|
16
|
-
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: *
|
24
|
+
version_requirements: *70230576091380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
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: *
|
35
|
+
version_requirements: *70230576090780
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: yajl-ruby
|
38
|
-
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: *
|
46
|
+
version_requirements: *70230576090240
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: cool.io
|
49
|
-
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: *
|
57
|
+
version_requirements: *70230576089620
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: http_parser.rb
|
60
|
-
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: *
|
68
|
+
version_requirements: *70230576088920
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
|
-
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: *
|
79
|
+
version_requirements: *70230576088280
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rr
|
82
|
-
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: *
|
90
|
+
version_requirements: *70230576087680
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: timecop
|
93
|
-
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: *
|
101
|
+
version_requirements: *70230576087040
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: jeweler
|
104
|
-
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: *
|
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
|