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.

@@ -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
- $log.debug "listening http on #{@bind}:#{@port}"
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
- $log.error "unexpected error", :error=>$!.to_s
102
- $log.error_backtrace
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
- $log.warn "unexpected error", :error=>$!.to_s
177
- $log.warn_backtrace
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
- $log.debug "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins"
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
- $log.error $!.to_s
41
- $log.error_backtrace
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
- $log.error "unexpected error", :error=>$!.to_s
66
- $log.error_backtrace
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
- $log.error "object space failed to emit", :error => e.to_s, :error_class => e.class.to_s, :tag => @tag, :record => Yajl.dump(record)
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
- $log.error $!.to_s
40
- $log.error_backtrace
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
- $log.error "unexpected error", :error=>$!.to_s
65
- $log.error_backtrace
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
- $log.error "unexpected error", :error=>$!.to_s
49
- $log.error_backtrace
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
- $log.error "unexpected error", :error=>$!.to_s
141
- $log.error_backtrace
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
- $log.error "unexpected error", :error=>$!.to_s
149
- $log.error_backtrace
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
- $log.trace { "closed fluent socket object_id=#{self.object_id}" }
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
- # $log.debug "listening fluent socket on #{@bind}:#{@port}"
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
- #$log.warn "'unix' input is obsoleted and will be removed. Use 'forward' instead."
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
- $log.debug "listening fluent socket on #{@path}"
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
- $log.error "unexpected error", :error=>$!.to_s
121
- $log.error_backtrace
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
- $log.debug "invalid syslog message: #{data.dump}"
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
- $log.warn data.dump, :error=>$!.to_s
143
- $log.debug_backtrace
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
- $log.debug "invalid syslog message", :data=>data
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
- $log.warn data.dump, :error=>$!.to_s
176
- $log.debug_backtrace
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
- $log.debug "listening syslog socket on #{@bind}:#{@port} with #{@protocol_type}"
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
- $log.error "syslog failed to emit", :error => e.to_s, :error_class => e.class.to_s, :tag => tag, :record => Yajl.dump(record)
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
- $log.error "syslog error", :error => e, :error_class => e.class
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
- $log.trace { "closed fluent socket object_id=#{self.object_id}" }
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
- $log.error "unexpected error", :error=>$!.to_s
86
- $log.error_backtrace
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
- $log.warn line.dump, :error=>$!.to_s
100
- $log.debug_backtrace
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
- $log.info "detected rotation of #{@path}"
243
+ log.info "detected rotation of #{@path}"
227
244
  # rotate imeediately if previous file is nil
228
245
  wait = 0
229
246
  else
230
- $log.info "detected rotation of #{@path}; waiting #{@rotate_wait} seconds"
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
- $log.error $!.to_s
249
- $log.error_backtrace
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
- $log.error $!.to_s
264
- $log.error_backtrace
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
- $log.info "following tail of #{io.path}"
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
- $log.error $!.to_s
332
- $log.error_backtrace
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
- $log.error $!.to_s
390
- $log.error_backtrace
416
+ @log.error $!.to_s
417
+ @log.error_backtrace
391
418
  end
392
419
  end
393
420
  end