lumberjack 1.0.13 → 1.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +129 -0
- data/{MIT_LICENSE → MIT_LICENSE.txt} +0 -0
- data/README.md +142 -23
- data/VERSION +1 -1
- data/lib/lumberjack.rb +70 -22
- data/lib/lumberjack/context.rb +35 -0
- data/lib/lumberjack/device.rb +22 -8
- data/lib/lumberjack/device/date_rolling_log_file.rb +9 -9
- data/lib/lumberjack/device/log_file.rb +14 -3
- data/lib/lumberjack/device/multi.rb +46 -0
- data/lib/lumberjack/device/null.rb +1 -3
- data/lib/lumberjack/device/rolling_log_file.rb +45 -21
- data/lib/lumberjack/device/size_rolling_log_file.rb +10 -10
- data/lib/lumberjack/device/writer.rb +92 -61
- data/lib/lumberjack/formatter.rb +97 -28
- data/lib/lumberjack/formatter/date_time_formatter.rb +25 -0
- data/lib/lumberjack/formatter/exception_formatter.rb +25 -2
- data/lib/lumberjack/formatter/id_formatter.rb +23 -0
- data/lib/lumberjack/formatter/object_formatter.rb +12 -0
- data/lib/lumberjack/formatter/pretty_print_formatter.rb +4 -4
- data/lib/lumberjack/formatter/string_formatter.rb +1 -1
- data/lib/lumberjack/formatter/strip_formatter.rb +12 -0
- data/lib/lumberjack/formatter/structured_formatter.rb +63 -0
- data/lib/lumberjack/log_entry.rb +44 -16
- data/lib/lumberjack/logger.rb +275 -69
- data/lib/lumberjack/rack.rb +3 -2
- data/lib/lumberjack/rack/context.rb +18 -0
- data/lib/lumberjack/rack/request_id.rb +4 -4
- data/lib/lumberjack/rack/unit_of_work.rb +1 -1
- data/lib/lumberjack/severity.rb +11 -10
- data/lib/lumberjack/tag_formatter.rb +96 -0
- data/lib/lumberjack/tagged_logger_support.rb +66 -0
- data/lib/lumberjack/tagged_logging.rb +29 -0
- data/lib/lumberjack/tags.rb +42 -0
- data/lib/lumberjack/template.rb +81 -33
- data/lumberjack.gemspec +31 -0
- metadata +26 -53
- data/Rakefile +0 -40
- data/spec/device/date_rolling_log_file_spec.rb +0 -73
- data/spec/device/log_file_spec.rb +0 -48
- data/spec/device/null_spec.rb +0 -12
- data/spec/device/rolling_log_file_spec.rb +0 -151
- data/spec/device/size_rolling_log_file_spec.rb +0 -58
- data/spec/device/writer_spec.rb +0 -118
- data/spec/formatter/exception_formatter_spec.rb +0 -20
- data/spec/formatter/inspect_formatter_spec.rb +0 -13
- data/spec/formatter/pretty_print_formatter_spec.rb +0 -14
- data/spec/formatter/string_formatter_spec.rb +0 -12
- data/spec/formatter_spec.rb +0 -45
- data/spec/log_entry_spec.rb +0 -69
- data/spec/logger_spec.rb +0 -411
- data/spec/lumberjack_spec.rb +0 -29
- data/spec/rack/request_id_spec.rb +0 -48
- data/spec/rack/unit_of_work_spec.rb +0 -26
- data/spec/severity_spec.rb +0 -23
- data/spec/spec_helper.rb +0 -32
- data/spec/template_spec.rb +0 -34
data/lib/lumberjack/logger.rb
CHANGED
@@ -30,14 +30,17 @@ module Lumberjack
|
|
30
30
|
# The time that the device was last flushed.
|
31
31
|
attr_reader :last_flushed_at
|
32
32
|
|
33
|
-
#
|
33
|
+
# Set +silencer+ to false to disable silencing the log.
|
34
|
+
attr_accessor :silencer
|
35
|
+
|
36
|
+
# Set the name of the program to attach to log entries.
|
34
37
|
attr_writer :progname
|
35
38
|
|
36
|
-
# The device being written to
|
37
|
-
|
39
|
+
# The device being written to
|
40
|
+
attr_accessor :device
|
38
41
|
|
39
|
-
#
|
40
|
-
attr_accessor :
|
42
|
+
# The TagFormatter used for formatting tags for output
|
43
|
+
attr_accessor :tag_formatter
|
41
44
|
|
42
45
|
# Create a new logger to log to a Device.
|
43
46
|
#
|
@@ -45,37 +48,50 @@ module Lumberjack
|
|
45
48
|
#
|
46
49
|
# If it is a Device object, that object will be used.
|
47
50
|
# If it has a +write+ method, it will be wrapped in a Device::Writer class.
|
48
|
-
# If it is
|
51
|
+
# If it is :null, it will be a Null device that won't record any output.
|
49
52
|
# Otherwise, it will be assumed to be file path and wrapped in a Device::LogFile class.
|
50
53
|
#
|
51
54
|
# This method can take the following options:
|
52
55
|
#
|
53
|
-
# *
|
54
|
-
# *
|
55
|
-
# *
|
56
|
-
# *
|
57
|
-
# *
|
56
|
+
# * :level - The logging level below which messages will be ignored.
|
57
|
+
# * :formatter - The formatter to use for outputting messages to the log.
|
58
|
+
# * :datetime_format - The format to use for log timestamps.
|
59
|
+
# * :tag_formatter - The TagFormatter to use for formatting tags.
|
60
|
+
# * :progname - The name of the program that will be recorded with each log entry.
|
61
|
+
# * :flush_seconds - The maximum number of seconds between flush calls.
|
62
|
+
# * :roll - If the log device is a file path, it will be a Device::DateRollingLogFile if this is set.
|
63
|
+
# * :max_size - If the log device is a file path, it will be a Device::SizeRollingLogFile if this is set.
|
58
64
|
#
|
59
65
|
# All other options are passed to the device constuctor.
|
60
|
-
def initialize(device =
|
61
|
-
@thread_settings = {}
|
62
|
-
|
66
|
+
def initialize(device = $stdout, options = {})
|
63
67
|
options = options.dup
|
64
68
|
self.level = options.delete(:level) || INFO
|
65
69
|
self.progname = options.delete(:progname)
|
66
70
|
max_flush_seconds = options.delete(:flush_seconds).to_f
|
67
71
|
|
68
|
-
@device = open_device(device, options)
|
69
|
-
|
72
|
+
@device = open_device(device, options) if device
|
73
|
+
self.formatter = (options[:formatter] || Formatter.new)
|
74
|
+
@tag_formatter = (options[:tag_formatter] || TagFormatter.new)
|
75
|
+
time_format = (options[:datetime_format] || options[:time_format])
|
76
|
+
self.datetime_format = time_format if time_format
|
70
77
|
@last_flushed_at = Time.now
|
71
78
|
@silencer = true
|
79
|
+
@tags = {}
|
80
|
+
@closed = false
|
72
81
|
|
73
82
|
create_flusher_thread(max_flush_seconds) if max_flush_seconds > 0
|
74
83
|
end
|
75
84
|
|
76
|
-
# Get the
|
77
|
-
def
|
78
|
-
|
85
|
+
# Get the timestamp format on the device if it has one.
|
86
|
+
def datetime_format
|
87
|
+
device.datetime_format if device.respond_to?(:datetime_format)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Set the timestamp format on the device if it is supported.
|
91
|
+
def datetime_format=(format)
|
92
|
+
if device.respond_to?(:datetime_format=)
|
93
|
+
device.datetime_format = format
|
94
|
+
end
|
79
95
|
end
|
80
96
|
|
81
97
|
# Get the level of severity of entries that are logged. Entries with a lower
|
@@ -84,6 +100,47 @@ module Lumberjack
|
|
84
100
|
thread_local_value(:lumberjack_logger_level) || @level
|
85
101
|
end
|
86
102
|
|
103
|
+
alias sev_threshold level
|
104
|
+
|
105
|
+
# Set the log level using either an integer level like Logger::INFO or a label like
|
106
|
+
# :info or "info"
|
107
|
+
def level=(value)
|
108
|
+
@level = if value.is_a?(Integer)
|
109
|
+
value
|
110
|
+
else
|
111
|
+
Severity.label_to_level(value)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
alias sev_threshold= level=
|
116
|
+
|
117
|
+
# Set the Lumberjack::Formatter used to format objects for logging as messages.
|
118
|
+
def formatter=(value)
|
119
|
+
@_formatter = (value.is_a?(TaggedLoggerSupport::Formatter) ? value.__formatter : value)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Get the Lumberjack::Formatter used to format objects for logging as messages.
|
123
|
+
def formatter
|
124
|
+
if respond_to?(:tagged)
|
125
|
+
# Wrap in an object that supports ActiveSupport::TaggedLogger API
|
126
|
+
TaggedLoggerSupport::Formatter.new(logger: self, formatter: @_formatter)
|
127
|
+
else
|
128
|
+
@_formatter
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Enable this logger to function like an ActiveSupport::TaggedLogger. This will make the logger
|
133
|
+
# API compatible with ActiveSupport::TaggedLogger and is provided as a means of compatibility
|
134
|
+
# with other libraries that assume they can call the `tagged` method on a logger to add tags.
|
135
|
+
#
|
136
|
+
# The tags added with this method are just strings so they are stored in the logger tags
|
137
|
+
# in an array under the "tagged" tag. So calling `logger.tagged("foo", "bar")` will result
|
138
|
+
# in tags `{"tagged" => ["foo", "bar"]}`.
|
139
|
+
def tagged_logger!
|
140
|
+
extend(TaggedLoggerSupport)
|
141
|
+
self
|
142
|
+
end
|
143
|
+
|
87
144
|
# Add a message to the log with a given severity. The message can be either
|
88
145
|
# passed in the +message+ argument or supplied with a block. This method
|
89
146
|
# is not normally called. Instead call one of the helper functions
|
@@ -94,39 +151,59 @@ module Lumberjack
|
|
94
151
|
#
|
95
152
|
# === Example
|
96
153
|
#
|
97
|
-
# logger.
|
98
|
-
# logger.
|
99
|
-
# logger.
|
100
|
-
# logger.
|
101
|
-
def
|
102
|
-
|
154
|
+
# logger.add_entry(Logger::ERROR, exception)
|
155
|
+
# logger.add_entry(Logger::INFO, "Request completed")
|
156
|
+
# logger.add_entry(:warn, "Request took a long time")
|
157
|
+
# logger.add_entry(Logger::DEBUG){"Start processing with options #{options.inspect}"}
|
158
|
+
def add_entry(severity, message, progname = nil, tags = nil)
|
159
|
+
begin
|
160
|
+
severity = Severity.label_to_level(severity) unless severity.is_a?(Integer)
|
161
|
+
return true unless device && severity && severity >= level
|
162
|
+
|
163
|
+
return true if Thread.current[:lumberjack_logging]
|
164
|
+
Thread.current[:lumberjack_logging] = true
|
103
165
|
|
104
|
-
|
166
|
+
time = Time.now
|
167
|
+
message = message.call if message.is_a?(Proc)
|
168
|
+
message = formatter.format(message)
|
169
|
+
progname ||= self.progname
|
105
170
|
|
106
|
-
|
171
|
+
current_tags = self.tags
|
172
|
+
tags = nil unless tags.is_a?(Hash)
|
173
|
+
if current_tags.empty?
|
174
|
+
tags = Tags.stringify_keys(tags) unless tags.nil?
|
175
|
+
else
|
176
|
+
tags = if tags.nil?
|
177
|
+
current_tags.dup
|
178
|
+
else
|
179
|
+
current_tags.merge(Tags.stringify_keys(tags))
|
180
|
+
end
|
181
|
+
end
|
182
|
+
tags = Tags.expand_runtime_values(tags)
|
183
|
+
tags = tag_formatter.format(tags) if tag_formatter
|
184
|
+
|
185
|
+
entry = LogEntry.new(time, severity, message, progname, $$, tags)
|
186
|
+
write_to_device(entry)
|
187
|
+
ensure
|
188
|
+
Thread.current[:lumberjack_logging] = nil
|
189
|
+
end
|
190
|
+
true
|
191
|
+
end
|
192
|
+
|
193
|
+
# ::Logger compatible method to add a log entry.
|
194
|
+
def add(severity, message = nil, progname = nil, &block)
|
107
195
|
if message.nil?
|
108
|
-
if
|
109
|
-
message =
|
196
|
+
if block
|
197
|
+
message = block
|
110
198
|
else
|
111
199
|
message = progname
|
112
200
|
progname = nil
|
113
201
|
end
|
114
202
|
end
|
115
|
-
|
116
|
-
message = @_formatter.format(message)
|
117
|
-
progname ||= self.progname
|
118
|
-
entry = LogEntry.new(time, severity, message, progname, $$, Lumberjack.unit_of_work_id)
|
119
|
-
begin
|
120
|
-
device.write(entry)
|
121
|
-
rescue => e
|
122
|
-
$stderr.puts("#{e.class.name}: #{e.message}#{' at ' + e.backtrace.first if e.backtrace}")
|
123
|
-
$stderr.puts(entry.to_s)
|
124
|
-
end
|
125
|
-
|
126
|
-
nil
|
203
|
+
add_entry(severity, message, progname)
|
127
204
|
end
|
128
205
|
|
129
|
-
|
206
|
+
alias log add
|
130
207
|
|
131
208
|
# Flush the logging device. Messages are not guaranteed to be written until this method is called.
|
132
209
|
def flush
|
@@ -138,12 +215,22 @@ module Lumberjack
|
|
138
215
|
# Close the logging device.
|
139
216
|
def close
|
140
217
|
flush
|
141
|
-
|
218
|
+
device.close if device.respond_to?(:close)
|
219
|
+
@closed = true
|
220
|
+
end
|
221
|
+
|
222
|
+
def closed?
|
223
|
+
@closed
|
224
|
+
end
|
225
|
+
|
226
|
+
def reopen(logdev = nil)
|
227
|
+
@closed = false
|
228
|
+
device.reopen(logdev) if device.respond_to?(:reopen)
|
142
229
|
end
|
143
230
|
|
144
231
|
# Log a +FATAL+ message. The message can be passed in either the +message+ argument or in a block.
|
145
|
-
def fatal(
|
146
|
-
|
232
|
+
def fatal(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
233
|
+
call_add_entry(FATAL, message_or_progname_or_tags, progname_or_tags, &block)
|
147
234
|
end
|
148
235
|
|
149
236
|
# Return +true+ if +FATAL+ messages are being logged.
|
@@ -151,9 +238,14 @@ module Lumberjack
|
|
151
238
|
level <= FATAL
|
152
239
|
end
|
153
240
|
|
241
|
+
# Set the log level to fatal.
|
242
|
+
def fatal!
|
243
|
+
self.level = FATAL
|
244
|
+
end
|
245
|
+
|
154
246
|
# Log an +ERROR+ message. The message can be passed in either the +message+ argument or in a block.
|
155
|
-
def error(
|
156
|
-
|
247
|
+
def error(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
248
|
+
call_add_entry(ERROR, message_or_progname_or_tags, progname_or_tags, &block)
|
157
249
|
end
|
158
250
|
|
159
251
|
# Return +true+ if +ERROR+ messages are being logged.
|
@@ -161,9 +253,14 @@ module Lumberjack
|
|
161
253
|
level <= ERROR
|
162
254
|
end
|
163
255
|
|
256
|
+
# Set the log level to error.
|
257
|
+
def error!
|
258
|
+
self.level = ERROR
|
259
|
+
end
|
260
|
+
|
164
261
|
# Log a +WARN+ message. The message can be passed in either the +message+ argument or in a block.
|
165
|
-
def warn(
|
166
|
-
|
262
|
+
def warn(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
263
|
+
call_add_entry(WARN, message_or_progname_or_tags, progname_or_tags, &block)
|
167
264
|
end
|
168
265
|
|
169
266
|
# Return +true+ if +WARN+ messages are being logged.
|
@@ -171,9 +268,14 @@ module Lumberjack
|
|
171
268
|
level <= WARN
|
172
269
|
end
|
173
270
|
|
271
|
+
# Set the log level to warn.
|
272
|
+
def warn!
|
273
|
+
self.level = WARN
|
274
|
+
end
|
275
|
+
|
174
276
|
# Log an +INFO+ message. The message can be passed in either the +message+ argument or in a block.
|
175
|
-
def info(
|
176
|
-
|
277
|
+
def info(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
278
|
+
call_add_entry(INFO, message_or_progname_or_tags, progname_or_tags, &block)
|
177
279
|
end
|
178
280
|
|
179
281
|
# Return +true+ if +INFO+ messages are being logged.
|
@@ -181,9 +283,14 @@ module Lumberjack
|
|
181
283
|
level <= INFO
|
182
284
|
end
|
183
285
|
|
286
|
+
# Set the log level to info.
|
287
|
+
def info!
|
288
|
+
self.level = INFO
|
289
|
+
end
|
290
|
+
|
184
291
|
# Log a +DEBUG+ message. The message can be passed in either the +message+ argument or in a block.
|
185
|
-
def debug(
|
186
|
-
|
292
|
+
def debug(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
293
|
+
call_add_entry(DEBUG, message_or_progname_or_tags, progname_or_tags, &block)
|
187
294
|
end
|
188
295
|
|
189
296
|
# Return +true+ if +DEBUG+ messages are being logged.
|
@@ -191,21 +298,19 @@ module Lumberjack
|
|
191
298
|
level <= DEBUG
|
192
299
|
end
|
193
300
|
|
301
|
+
# Set the log level to debug.
|
302
|
+
def debug!
|
303
|
+
self.level = DEBUG
|
304
|
+
end
|
305
|
+
|
194
306
|
# Log a message when the severity is not known. Unknown messages will always appear in the log.
|
195
307
|
# The message can be passed in either the +message+ argument or in a block.
|
196
|
-
def unknown(
|
197
|
-
|
308
|
+
def unknown(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
|
309
|
+
call_add_entry(UNKNOWN, message_or_progname_or_tags, progname_or_tags, &block)
|
198
310
|
end
|
199
311
|
|
200
|
-
|
201
|
-
|
202
|
-
# Set the minimum level of severity of messages to log.
|
203
|
-
def level=(severity)
|
204
|
-
if severity.is_a?(Integer)
|
205
|
-
@level = severity
|
206
|
-
else
|
207
|
-
@level = Severity.label_to_level(severity)
|
208
|
-
end
|
312
|
+
def <<(msg)
|
313
|
+
add_entry(UNKNOWN, msg)
|
209
314
|
end
|
210
315
|
|
211
316
|
# Silence the logger by setting a new log level inside a block. By default, only +ERROR+ or +FATAL+
|
@@ -213,12 +318,15 @@ module Lumberjack
|
|
213
318
|
#
|
214
319
|
# === Example
|
215
320
|
#
|
216
|
-
# logger.level =
|
321
|
+
# logger.level = Logger::INFO
|
217
322
|
# logger.silence do
|
218
323
|
# do_something # Log level inside the block is +ERROR+
|
219
324
|
# end
|
220
325
|
def silence(temporary_level = ERROR, &block)
|
221
326
|
if silencer
|
327
|
+
unless temporary_level.is_a?(Integer)
|
328
|
+
temporary_level = Severity.label_to_level(temporary_level)
|
329
|
+
end
|
222
330
|
push_thread_local_value(:lumberjack_logger_level, temporary_level, &block)
|
223
331
|
else
|
224
332
|
yield
|
@@ -240,8 +348,95 @@ module Lumberjack
|
|
240
348
|
thread_local_value(:lumberjack_logger_progname) || @progname
|
241
349
|
end
|
242
350
|
|
351
|
+
# Set a hash of tags on logger. If a block is given, the tags will only be set
|
352
|
+
# for the duration of the block. If this method is called inside such a block,
|
353
|
+
# the tags will only be defined on the tags in that block. When the parent block
|
354
|
+
# exits, all the tags will be reverted. If there is no block, then the tags will
|
355
|
+
# be defined as global and apply to all log statements.
|
356
|
+
def tag(tags, &block)
|
357
|
+
tags = Tags.stringify_keys(tags)
|
358
|
+
thread_tags = thread_local_value(:lumberjack_logger_tags)
|
359
|
+
if block
|
360
|
+
merged_tags = (thread_tags ? thread_tags.merge(tags) : tags.dup)
|
361
|
+
push_thread_local_value(:lumberjack_logger_tags, merged_tags, &block)
|
362
|
+
elsif thread_tags
|
363
|
+
thread_tags.merge!(tags)
|
364
|
+
nil
|
365
|
+
else
|
366
|
+
@tags.merge!(tags)
|
367
|
+
nil
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
# Remove a tag from the current tag context. If this is called inside a block to a
|
372
|
+
# call to `tag`, the tags will only be removed for the duration of that block. Otherwise
|
373
|
+
# they will be removed from the global tags.
|
374
|
+
def remove_tag(*tag_names)
|
375
|
+
thread_tags = thread_local_value(:lumberjack_logger_tags)
|
376
|
+
if thread_tags
|
377
|
+
tag_names.each { |name| thread_tags.delete(name.to_s) }
|
378
|
+
else
|
379
|
+
tag_names.each { |name| @tags.delete(name.to_s) }
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# Return all tags in scope on the logger including global tags set on the Lumberjack
|
384
|
+
# context, tags set on the logger, and tags set on the current block for the logger.
|
385
|
+
def tags
|
386
|
+
tags = {}
|
387
|
+
context_tags = Lumberjack.context_tags
|
388
|
+
tags.merge!(context_tags) if context_tags && !context_tags.empty?
|
389
|
+
tags.merge!(@tags) if !@tags.empty? && !thread_local_value(:lumberjack_logger_untagged)
|
390
|
+
scope_tags = thread_local_value(:lumberjack_logger_tags)
|
391
|
+
tags.merge!(scope_tags) if scope_tags && !scope_tags.empty?
|
392
|
+
tags
|
393
|
+
end
|
394
|
+
|
395
|
+
# Remove all tags on the current logger and logging context within a block.
|
396
|
+
# You can still set new block scoped tags within theuntagged block and provide
|
397
|
+
# tags on individual log methods.
|
398
|
+
def untagged(&block)
|
399
|
+
Lumberjack.use_context(nil) do
|
400
|
+
scope_tags = thread_local_value(:lumberjack_logger_tags)
|
401
|
+
untagged = thread_local_value(:lumberjack_logger_untagged)
|
402
|
+
begin
|
403
|
+
set_thread_local_value(:lumberjack_logger_untagged, true)
|
404
|
+
set_thread_local_value(:lumberjack_logger_tags, nil)
|
405
|
+
tag({}, &block)
|
406
|
+
ensure
|
407
|
+
set_thread_local_value(:lumberjack_logger_untagged, untagged)
|
408
|
+
set_thread_local_value(:lumberjack_logger_tags, scope_tags)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
243
413
|
private
|
244
414
|
|
415
|
+
# Dereference arguments to log calls so we can have methods with compatibility with ::Logger
|
416
|
+
def call_add_entry(severity, message_or_progname_or_tags, progname_or_tags, &block) #:nodoc:
|
417
|
+
message = nil
|
418
|
+
progname = nil
|
419
|
+
tags = nil
|
420
|
+
if block
|
421
|
+
message = block
|
422
|
+
if message_or_progname_or_tags.is_a?(Hash)
|
423
|
+
tags = message_or_progname_or_tags
|
424
|
+
progname = progname_or_tags
|
425
|
+
else
|
426
|
+
progname = message_or_progname_or_tags
|
427
|
+
tags = progname_or_tags if progname_or_tags.is_a?(Hash)
|
428
|
+
end
|
429
|
+
else
|
430
|
+
message = message_or_progname_or_tags
|
431
|
+
if progname_or_tags.is_a?(Hash)
|
432
|
+
tags = progname_or_tags
|
433
|
+
else
|
434
|
+
progname = progname_or_tags
|
435
|
+
end
|
436
|
+
end
|
437
|
+
add_entry(severity, message, progname, tags)
|
438
|
+
end
|
439
|
+
|
245
440
|
# Set a local value for a thread tied to this object.
|
246
441
|
def set_thread_local_value(name, value) #:nodoc:
|
247
442
|
values = Thread.current[name]
|
@@ -276,7 +471,9 @@ module Lumberjack
|
|
276
471
|
|
277
472
|
# Open a logging device.
|
278
473
|
def open_device(device, options) #:nodoc:
|
279
|
-
if device.
|
474
|
+
if device.nil?
|
475
|
+
nil
|
476
|
+
elsif device.is_a?(Device)
|
280
477
|
device
|
281
478
|
elsif device.respond_to?(:write) && device.respond_to?(:flush)
|
282
479
|
Device::Writer.new(device, options)
|
@@ -287,25 +484,34 @@ module Lumberjack
|
|
287
484
|
if options[:roll]
|
288
485
|
Device::DateRollingLogFile.new(device, options)
|
289
486
|
elsif options[:max_size]
|
290
|
-
|
487
|
+
Device::SizeRollingLogFile.new(device, options)
|
291
488
|
else
|
292
489
|
Device::LogFile.new(device, options)
|
293
490
|
end
|
294
491
|
end
|
295
492
|
end
|
296
493
|
|
494
|
+
def write_to_device(entry) #:nodoc:
|
495
|
+
device.write(entry)
|
496
|
+
rescue => e
|
497
|
+
# rubocop:disable Style/StderrPuts
|
498
|
+
$stderr.puts("#{e.class.name}: #{e.message}#{" at " + e.backtrace.first if e.backtrace}")
|
499
|
+
$stderr.puts(entry.to_s)
|
500
|
+
# rubocop:enable Style/StderrPuts
|
501
|
+
end
|
502
|
+
|
297
503
|
# Create a thread that will periodically call flush.
|
298
504
|
def create_flusher_thread(flush_seconds) #:nodoc:
|
299
505
|
if flush_seconds > 0
|
300
506
|
begin
|
301
507
|
logger = self
|
302
508
|
Thread.new do
|
303
|
-
|
509
|
+
until closed?
|
304
510
|
begin
|
305
511
|
sleep(flush_seconds)
|
306
512
|
logger.flush if Time.now - logger.last_flushed_at >= flush_seconds
|
307
513
|
rescue => e
|
308
|
-
|
514
|
+
warn("Error flushing log: #{e.inspect}")
|
309
515
|
end
|
310
516
|
end
|
311
517
|
end
|