fluentd 0.10.42 → 0.10.43
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.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- data/ChangeLog +9 -0
- data/README.rdoc +4 -1
- data/fluentd.gemspec +1 -0
- data/lib/fluent/input.rb +1 -1
- data/lib/fluent/load.rb +1 -0
- data/lib/fluent/log.rb +84 -9
- data/lib/fluent/output.rb +6 -2
- data/lib/fluent/parser.rb +9 -5
- data/lib/fluent/plugin/in_debug_agent.rb +1 -1
- data/lib/fluent/plugin/in_exec.rb +3 -3
- data/lib/fluent/plugin/in_forward.rb +14 -13
- data/lib/fluent/plugin/in_gc_stat.rb +7 -6
- data/lib/fluent/plugin/in_http.rb +17 -7
- data/lib/fluent/plugin/in_monitor_agent.rb +1 -1
- data/lib/fluent/plugin/in_object_space.rb +8 -7
- data/lib/fluent/plugin/in_status.rb +7 -6
- data/lib/fluent/plugin/in_stream.rb +14 -13
- data/lib/fluent/plugin/in_syslog.rb +17 -15
- data/lib/fluent/plugin/in_tail.rb +46 -19
- data/lib/fluent/plugin/out_copy.rb +1 -1
- data/lib/fluent/plugin/out_exec_filter.rb +14 -13
- data/lib/fluent/plugin/out_forward.rb +16 -15
- data/lib/fluent/plugin/out_roundrobin.rb +5 -1
- data/lib/fluent/plugin/out_stdout.rb +1 -0
- data/lib/fluent/version.rb +1 -1
- data/test/output.rb +61 -0
- data/test/parser.rb +7 -0
- data/test/plugin/in_http.rb +29 -1
- metadata +66 -27
- checksums.yaml +0 -7
@@ -33,6 +33,7 @@ module Fluent
|
|
33
33
|
config_param :body_size_limit, :size, :default => 32*1024*1024 # TODO default
|
34
34
|
config_param :keepalive_timeout, :time, :default => 10 # TODO default
|
35
35
|
config_param :backlog, :integer, :default => nil
|
36
|
+
config_param :add_http_headers, :bool, :default => false
|
36
37
|
|
37
38
|
def configure(conf)
|
38
39
|
super
|
@@ -70,14 +71,14 @@ module Fluent
|
|
70
71
|
end
|
71
72
|
|
72
73
|
def start
|
73
|
-
|
74
|
+
log.debug "listening http on #{@bind}:#{@port}"
|
74
75
|
lsock = TCPServer.new(@bind, @port)
|
75
76
|
|
76
77
|
detach_multi_process do
|
77
78
|
super
|
78
79
|
@km = KeepaliveManager.new(@keepalive_timeout)
|
79
80
|
#@lsock = Coolio::TCPServer.new(@bind, @port, Handler, @km, method(:on_request), @body_size_limit)
|
80
|
-
@lsock = Coolio::TCPServer.new(lsock, nil, Handler, @km, method(:on_request), @body_size_limit)
|
81
|
+
@lsock = Coolio::TCPServer.new(lsock, nil, Handler, @km, method(:on_request), @body_size_limit, log)
|
81
82
|
@lsock.listen(@backlog) unless @backlog.nil?
|
82
83
|
|
83
84
|
@loop = Coolio::Loop.new
|
@@ -98,8 +99,8 @@ module Fluent
|
|
98
99
|
def run
|
99
100
|
@loop.run
|
100
101
|
rescue
|
101
|
-
|
102
|
-
|
102
|
+
log.error "unexpected error", :error=>$!.to_s
|
103
|
+
log.error_backtrace
|
103
104
|
end
|
104
105
|
|
105
106
|
def on_request(path_info, params)
|
@@ -121,6 +122,14 @@ module Fluent
|
|
121
122
|
if record.nil?
|
122
123
|
return ["200 OK", {'Content-type'=>'text/plain'}, ""]
|
123
124
|
end
|
125
|
+
|
126
|
+
if @add_http_headers
|
127
|
+
params.each_pair { |k,v|
|
128
|
+
if k.start_with?("HTTP_")
|
129
|
+
record[k] = v
|
130
|
+
end
|
131
|
+
}
|
132
|
+
end
|
124
133
|
|
125
134
|
time = params['time']
|
126
135
|
time = time.to_i
|
@@ -143,13 +152,14 @@ module Fluent
|
|
143
152
|
end
|
144
153
|
|
145
154
|
class Handler < Coolio::Socket
|
146
|
-
def initialize(io, km, callback, body_size_limit)
|
155
|
+
def initialize(io, km, callback, body_size_limit, log)
|
147
156
|
super(io)
|
148
157
|
@km = km
|
149
158
|
@callback = callback
|
150
159
|
@body_size_limit = body_size_limit
|
151
160
|
@content_type = ""
|
152
161
|
@next_close = false
|
162
|
+
@log = log
|
153
163
|
|
154
164
|
@idle = 0
|
155
165
|
@km.add(self)
|
@@ -173,8 +183,8 @@ module Fluent
|
|
173
183
|
@idle = 0
|
174
184
|
@parser << data
|
175
185
|
rescue
|
176
|
-
|
177
|
-
|
186
|
+
@log.warn "unexpected error", :error=>$!.to_s
|
187
|
+
@log.warn_backtrace
|
178
188
|
close
|
179
189
|
end
|
180
190
|
|
@@ -154,7 +154,7 @@ module Fluent
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def start
|
157
|
-
|
157
|
+
log.debug "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins"
|
158
158
|
@srv = WEBrick::HTTPServer.new({
|
159
159
|
:BindAddress => @bind,
|
160
160
|
:Port => @port,
|
@@ -28,8 +28,9 @@ module Fluent
|
|
28
28
|
config_param :top, :integer, :default => 15
|
29
29
|
|
30
30
|
class TimerWatcher < Coolio::TimerWatcher
|
31
|
-
def initialize(interval, repeat, &callback)
|
31
|
+
def initialize(interval, repeat, log, &callback)
|
32
32
|
@callback = callback
|
33
|
+
@log = log
|
33
34
|
super(interval, repeat)
|
34
35
|
end
|
35
36
|
|
@@ -37,8 +38,8 @@ module Fluent
|
|
37
38
|
@callback.call
|
38
39
|
rescue
|
39
40
|
# TODO log?
|
40
|
-
|
41
|
-
|
41
|
+
@log.error $!.to_s
|
42
|
+
@log.error_backtrace
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
@@ -48,7 +49,7 @@ module Fluent
|
|
48
49
|
|
49
50
|
def start
|
50
51
|
@loop = Coolio::Loop.new
|
51
|
-
@timer = TimerWatcher.new(@emit_interval, true, &method(:on_timer))
|
52
|
+
@timer = TimerWatcher.new(@emit_interval, true, log, &method(:on_timer))
|
52
53
|
@loop.attach(@timer)
|
53
54
|
@thread = Thread.new(&method(:run))
|
54
55
|
end
|
@@ -62,8 +63,8 @@ module Fluent
|
|
62
63
|
def run
|
63
64
|
@loop.run
|
64
65
|
rescue
|
65
|
-
|
66
|
-
|
66
|
+
log.error "unexpected error", :error=>$!.to_s
|
67
|
+
log.error_backtrace
|
67
68
|
end
|
68
69
|
|
69
70
|
class Counter
|
@@ -110,7 +111,7 @@ module Fluent
|
|
110
111
|
|
111
112
|
Engine.emit(@tag, now, record)
|
112
113
|
rescue => e
|
113
|
-
|
114
|
+
log.error "object space failed to emit", :error => e.to_s, :error_class => e.class.to_s, :tag => @tag, :record => Yajl.dump(record)
|
114
115
|
end
|
115
116
|
end
|
116
117
|
end
|
@@ -27,8 +27,9 @@ module Fluent
|
|
27
27
|
config_param :tag, :string
|
28
28
|
|
29
29
|
class TimerWatcher < Coolio::TimerWatcher
|
30
|
-
def initialize(interval, repeat, &callback)
|
30
|
+
def initialize(interval, repeat, log, &callback)
|
31
31
|
@callback = callback
|
32
|
+
@log = log
|
32
33
|
super(interval, repeat)
|
33
34
|
end
|
34
35
|
|
@@ -36,8 +37,8 @@ module Fluent
|
|
36
37
|
@callback.call
|
37
38
|
rescue
|
38
39
|
# TODO log?
|
39
|
-
|
40
|
-
|
40
|
+
@log.error $!.to_s
|
41
|
+
@log.error_backtrace
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -47,7 +48,7 @@ module Fluent
|
|
47
48
|
|
48
49
|
def start
|
49
50
|
@loop = Coolio::Loop.new
|
50
|
-
@timer = TimerWatcher.new(@emit_interval, true, &method(:on_timer))
|
51
|
+
@timer = TimerWatcher.new(@emit_interval, true, log, &method(:on_timer))
|
51
52
|
@loop.attach(@timer)
|
52
53
|
@thread = Thread.new(&method(:run))
|
53
54
|
end
|
@@ -61,8 +62,8 @@ module Fluent
|
|
61
62
|
def run
|
62
63
|
@loop.run
|
63
64
|
rescue
|
64
|
-
|
65
|
-
|
65
|
+
log.error "unexpected error", :error=>$!.to_s
|
66
|
+
log.error_backtrace
|
66
67
|
end
|
67
68
|
|
68
69
|
def on_timer
|
@@ -45,8 +45,8 @@ module Fluent
|
|
45
45
|
def run
|
46
46
|
@loop.run
|
47
47
|
rescue
|
48
|
-
|
49
|
-
|
48
|
+
log.error "unexpected error", :error=>$!.to_s
|
49
|
+
log.error_backtrace
|
50
50
|
end
|
51
51
|
|
52
52
|
protected
|
@@ -104,14 +104,15 @@ module Fluent
|
|
104
104
|
end
|
105
105
|
|
106
106
|
class Handler < Coolio::Socket
|
107
|
-
def initialize(io, on_message)
|
107
|
+
def initialize(io, log, on_message)
|
108
108
|
super(io)
|
109
109
|
if io.is_a?(TCPSocket)
|
110
110
|
opt = [1, @timeout.to_i].pack('I!I!') # { int l_onoff; int l_linger; }
|
111
111
|
io.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, opt)
|
112
112
|
end
|
113
|
-
$log.trace { "accepted fluent socket object_id=#{self.object_id}" }
|
114
113
|
@on_message = on_message
|
114
|
+
@log = log
|
115
|
+
@log.trace { "accepted fluent socket object_id=#{self.object_id}" }
|
115
116
|
end
|
116
117
|
|
117
118
|
def on_connect
|
@@ -137,21 +138,21 @@ module Fluent
|
|
137
138
|
def on_read_json(data)
|
138
139
|
@y << data
|
139
140
|
rescue
|
140
|
-
|
141
|
-
|
141
|
+
@log.error "unexpected error", :error=>$!.to_s
|
142
|
+
@log.error_backtrace
|
142
143
|
close
|
143
144
|
end
|
144
145
|
|
145
146
|
def on_read_msgpack(data)
|
146
147
|
@u.feed_each(data, &@on_message)
|
147
148
|
rescue
|
148
|
-
|
149
|
-
|
149
|
+
@log.error "unexpected error", :error=>$!.to_s
|
150
|
+
@log.error_backtrace
|
150
151
|
close
|
151
152
|
end
|
152
153
|
|
153
154
|
def on_close
|
154
|
-
|
155
|
+
@log.trace { "closed fluent socket object_id=#{self.object_id}" }
|
155
156
|
end
|
156
157
|
end
|
157
158
|
end
|
@@ -170,7 +171,7 @@ module Fluent
|
|
170
171
|
# end
|
171
172
|
#
|
172
173
|
# def listen
|
173
|
-
#
|
174
|
+
# log.debug "listening fluent socket on #{@bind}:#{@port}"
|
174
175
|
# Coolio::TCPServer.new(@bind, @port, Handler, method(:on_message))
|
175
176
|
# end
|
176
177
|
#end
|
@@ -192,7 +193,7 @@ module Fluent
|
|
192
193
|
|
193
194
|
def configure(conf)
|
194
195
|
super
|
195
|
-
|
196
|
+
#log.warn "'unix' input is obsoleted and will be removed. Use 'forward' instead."
|
196
197
|
end
|
197
198
|
|
198
199
|
def listen
|
@@ -200,8 +201,8 @@ module Fluent
|
|
200
201
|
File.unlink(@path)
|
201
202
|
end
|
202
203
|
FileUtils.mkdir_p File.dirname(@path)
|
203
|
-
|
204
|
-
s = Coolio::UNIXServer.new(@path, Handler, method(:on_message))
|
204
|
+
log.debug "listening fluent socket on #{@path}"
|
205
|
+
s = Coolio::UNIXServer.new(@path, Handler, log, method(:on_message))
|
205
206
|
s.listen(@backlog) unless @backlog.nil?
|
206
207
|
s
|
207
208
|
end
|
@@ -117,15 +117,15 @@ module Fluent
|
|
117
117
|
def run
|
118
118
|
@loop.run
|
119
119
|
rescue
|
120
|
-
|
121
|
-
|
120
|
+
log.error "unexpected error", :error=>$!.to_s
|
121
|
+
log.error_backtrace
|
122
122
|
end
|
123
123
|
|
124
124
|
protected
|
125
125
|
def receive_data_parser(data)
|
126
126
|
m = SYSLOG_REGEXP.match(data)
|
127
127
|
unless m
|
128
|
-
|
128
|
+
log.debug "invalid syslog message: #{data.dump}"
|
129
129
|
return
|
130
130
|
end
|
131
131
|
pri = m[1].to_i
|
@@ -133,20 +133,21 @@ module Fluent
|
|
133
133
|
|
134
134
|
time, record = @parser.parse(text)
|
135
135
|
unless time && record
|
136
|
+
log.warn "pattern not match: #{text.inspect}"
|
136
137
|
return
|
137
138
|
end
|
138
139
|
|
139
140
|
emit(pri, time, record)
|
140
141
|
|
141
142
|
rescue
|
142
|
-
|
143
|
-
|
143
|
+
log.warn data.dump, :error=>$!.to_s
|
144
|
+
log.debug_backtrace
|
144
145
|
end
|
145
146
|
|
146
147
|
def receive_data(data)
|
147
148
|
m = SYSLOG_ALL_REGEXP.match(data)
|
148
149
|
unless m
|
149
|
-
|
150
|
+
log.debug "invalid syslog message", :data=>data
|
150
151
|
return
|
151
152
|
end
|
152
153
|
|
@@ -172,20 +173,20 @@ module Fluent
|
|
172
173
|
emit(pri, time, record)
|
173
174
|
|
174
175
|
rescue
|
175
|
-
|
176
|
-
|
176
|
+
log.warn data.dump, :error=>$!.to_s
|
177
|
+
log.debug_backtrace
|
177
178
|
end
|
178
179
|
|
179
180
|
private
|
180
181
|
|
181
182
|
def listen(callback)
|
182
|
-
|
183
|
+
log.debug "listening syslog socket on #{@bind}:#{@port} with #{@protocol_type}"
|
183
184
|
if @protocol_type == :udp
|
184
185
|
@usock = SocketUtil.create_udp_socket(@bind)
|
185
186
|
@usock.bind(@bind, @port)
|
186
187
|
UdpHandler.new(@usock, callback)
|
187
188
|
else
|
188
|
-
Coolio::TCPServer.new(@bind, @port, TcpHandler, callback)
|
189
|
+
Coolio::TCPServer.new(@bind, @port, TcpHandler, log, callback)
|
189
190
|
end
|
190
191
|
end
|
191
192
|
|
@@ -197,7 +198,7 @@ module Fluent
|
|
197
198
|
|
198
199
|
Engine.emit(tag, time, record)
|
199
200
|
rescue => e
|
200
|
-
|
201
|
+
log.error "syslog failed to emit", :error => e.to_s, :error_class => e.class.to_s, :tag => tag, :record => Yajl.dump(record)
|
201
202
|
end
|
202
203
|
|
203
204
|
class UdpHandler < Coolio::IO
|
@@ -219,14 +220,15 @@ module Fluent
|
|
219
220
|
end
|
220
221
|
|
221
222
|
class TcpHandler < Coolio::Socket
|
222
|
-
def initialize(io, on_message)
|
223
|
+
def initialize(io, log, on_message)
|
223
224
|
super(io)
|
224
225
|
if io.is_a?(TCPSocket)
|
225
226
|
opt = [1, @timeout.to_i].pack('I!I!') # { int l_onoff; int l_linger; }
|
226
227
|
io.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, opt)
|
227
228
|
end
|
228
|
-
$log.trace { "accepted fluent socket object_id=#{self.object_id}" }
|
229
229
|
@on_message = on_message
|
230
|
+
@log = log
|
231
|
+
@log.trace { "accepted fluent socket object_id=#{self.object_id}" }
|
230
232
|
@buffer = "".force_encoding('ASCII-8BIT')
|
231
233
|
end
|
232
234
|
|
@@ -245,12 +247,12 @@ module Fluent
|
|
245
247
|
end
|
246
248
|
@buffer.slice!(0, pos) if pos > 0
|
247
249
|
rescue => e
|
248
|
-
|
250
|
+
@log.error "syslog error", :error => e, :error_class => e.class
|
249
251
|
close
|
250
252
|
end
|
251
253
|
|
252
254
|
def on_close
|
253
|
-
|
255
|
+
@log.trace { "closed fluent socket object_id=#{self.object_id}" }
|
254
256
|
end
|
255
257
|
end
|
256
258
|
end
|
@@ -62,7 +62,9 @@ module Fluent
|
|
62
62
|
@loop = Coolio::Loop.new
|
63
63
|
@tails = @paths.map {|path|
|
64
64
|
pe = @pf ? @pf[path] : MemoryPositionEntry.new
|
65
|
-
TailWatcher.new(path, @rotate_wait, pe, &method(:receive_lines))
|
65
|
+
tw = TailWatcher.new(path, @rotate_wait, pe, &method(:receive_lines))
|
66
|
+
tw.log = log
|
67
|
+
tw
|
66
68
|
}
|
67
69
|
@tails.each {|tail|
|
68
70
|
tail.attach(@loop)
|
@@ -82,8 +84,8 @@ module Fluent
|
|
82
84
|
def run
|
83
85
|
@loop.run
|
84
86
|
rescue
|
85
|
-
|
86
|
-
|
87
|
+
log.error "unexpected error", :error=>$!.to_s
|
88
|
+
log.error_backtrace
|
87
89
|
end
|
88
90
|
|
89
91
|
def receive_lines(lines)
|
@@ -94,10 +96,12 @@ module Fluent
|
|
94
96
|
time, record = parse_line(line)
|
95
97
|
if time && record
|
96
98
|
es.add(time, record)
|
99
|
+
else
|
100
|
+
log.warn "pattern not match: #{line.inspect}"
|
97
101
|
end
|
98
102
|
rescue
|
99
|
-
|
100
|
-
|
103
|
+
log.warn line.dump, :error=>$!.to_s
|
104
|
+
log.debug_backtrace
|
101
105
|
end
|
102
106
|
}
|
103
107
|
|
@@ -128,6 +132,19 @@ module Fluent
|
|
128
132
|
|
129
133
|
@rotate_handler = RotateHandler.new(path, &method(:on_rotate))
|
130
134
|
@io_handler = nil
|
135
|
+
@log = $log
|
136
|
+
end
|
137
|
+
|
138
|
+
# We use accessor approach to assign each logger, not passing log object at initialization,
|
139
|
+
# because several plugins depend on these internal classes.
|
140
|
+
# This approach avoids breaking plugins with new log_level option.
|
141
|
+
attr_accessor :log
|
142
|
+
|
143
|
+
def log=(logger)
|
144
|
+
@log = logger
|
145
|
+
@timer_trigger.log = logger
|
146
|
+
@stat_trigger.log = logger
|
147
|
+
@rotate_handler.log = logger
|
131
148
|
end
|
132
149
|
|
133
150
|
def attach(loop)
|
@@ -173,7 +190,7 @@ module Fluent
|
|
173
190
|
pos = io.pos
|
174
191
|
end
|
175
192
|
@pe.update(inode, pos)
|
176
|
-
io_handler = IOHandler.new(io, @pe, &@receive_lines)
|
193
|
+
io_handler = IOHandler.new(io, @pe, log, &@receive_lines)
|
177
194
|
else
|
178
195
|
io_handler = NullIOHandler.new
|
179
196
|
end
|
@@ -212,7 +229,7 @@ module Fluent
|
|
212
229
|
end
|
213
230
|
io.seek(pos)
|
214
231
|
|
215
|
-
@io_handler = IOHandler.new(io, @pe, &@receive_lines)
|
232
|
+
@io_handler = IOHandler.new(io, @pe, log, &@receive_lines)
|
216
233
|
else
|
217
234
|
@io_handler = NullIOHandler.new
|
218
235
|
end
|
@@ -223,11 +240,11 @@ module Fluent
|
|
223
240
|
end
|
224
241
|
last_io = @rotate_queue.empty? ? @io_handler.io : @rotate_queue.last.io
|
225
242
|
if last_io == nil
|
226
|
-
|
243
|
+
log.info "detected rotation of #{@path}"
|
227
244
|
# rotate imeediately if previous file is nil
|
228
245
|
wait = 0
|
229
246
|
else
|
230
|
-
|
247
|
+
log.info "detected rotation of #{@path}; waiting #{@rotate_wait} seconds"
|
231
248
|
wait = @rotate_wait
|
232
249
|
wait -= @rotate_queue.first.wait unless @rotate_queue.empty?
|
233
250
|
end
|
@@ -238,30 +255,36 @@ module Fluent
|
|
238
255
|
class TimerWatcher < Coolio::TimerWatcher
|
239
256
|
def initialize(interval, repeat, &callback)
|
240
257
|
@callback = callback
|
258
|
+
@log = $log
|
241
259
|
super(interval, repeat)
|
242
260
|
end
|
243
261
|
|
262
|
+
attr_accessor :log
|
263
|
+
|
244
264
|
def on_timer
|
245
265
|
@callback.call
|
246
266
|
rescue
|
247
267
|
# TODO log?
|
248
|
-
|
249
|
-
|
268
|
+
@log.error $!.to_s
|
269
|
+
@log.error_backtrace
|
250
270
|
end
|
251
271
|
end
|
252
272
|
|
253
273
|
class StatWatcher < Coolio::StatWatcher
|
254
274
|
def initialize(path, &callback)
|
255
275
|
@callback = callback
|
276
|
+
@log = $log
|
256
277
|
super(path)
|
257
278
|
end
|
258
279
|
|
280
|
+
attr_accessor :log
|
281
|
+
|
259
282
|
def on_change(prev, cur)
|
260
283
|
@callback.call
|
261
284
|
rescue
|
262
285
|
# TODO log?
|
263
|
-
|
264
|
-
|
286
|
+
@log.error $!.to_s
|
287
|
+
@log.error_backtrace
|
265
288
|
end
|
266
289
|
end
|
267
290
|
|
@@ -285,8 +308,9 @@ module Fluent
|
|
285
308
|
MAX_LINES_AT_ONCE = 1000
|
286
309
|
|
287
310
|
class IOHandler
|
288
|
-
def initialize(io, pe, &receive_lines)
|
289
|
-
|
311
|
+
def initialize(io, pe, log, &receive_lines)
|
312
|
+
@log = log
|
313
|
+
@log.info "following tail of #{io.path}"
|
290
314
|
@io = io
|
291
315
|
@pe = pe
|
292
316
|
@receive_lines = receive_lines
|
@@ -328,8 +352,8 @@ module Fluent
|
|
328
352
|
end while read_more
|
329
353
|
|
330
354
|
rescue
|
331
|
-
|
332
|
-
|
355
|
+
@log.error $!.to_s
|
356
|
+
@log.error_backtrace
|
333
357
|
close
|
334
358
|
end
|
335
359
|
|
@@ -358,8 +382,11 @@ module Fluent
|
|
358
382
|
@inode = nil
|
359
383
|
@fsize = -1 # first
|
360
384
|
@on_rotate = on_rotate
|
385
|
+
@log = $log
|
361
386
|
end
|
362
387
|
|
388
|
+
attr_accessor :log
|
389
|
+
|
363
390
|
def on_notify
|
364
391
|
begin
|
365
392
|
io = File.open(@path)
|
@@ -386,8 +413,8 @@ module Fluent
|
|
386
413
|
end
|
387
414
|
|
388
415
|
rescue
|
389
|
-
|
390
|
-
|
416
|
+
@log.error $!.to_s
|
417
|
+
@log.error_backtrace
|
391
418
|
end
|
392
419
|
end
|
393
420
|
end
|