lumberjack 1.2.8 → 1.2.10

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +152 -58
  3. data/README.md +35 -6
  4. data/VERSION +1 -1
  5. data/lib/lumberjack/context.rb +13 -0
  6. data/lib/lumberjack/device/date_rolling_log_file.rb +10 -1
  7. data/lib/lumberjack/device/log_file.rb +8 -1
  8. data/lib/lumberjack/device/multi.rb +2 -1
  9. data/lib/lumberjack/device/null.rb +1 -1
  10. data/lib/lumberjack/device/rolling_log_file.rb +22 -22
  11. data/lib/lumberjack/device/size_rolling_log_file.rb +1 -1
  12. data/lib/lumberjack/device/writer.rb +21 -1
  13. data/lib/lumberjack/device.rb +16 -1
  14. data/lib/lumberjack/formatter/date_time_formatter.rb +2 -1
  15. data/lib/lumberjack/formatter/exception_formatter.rb +4 -2
  16. data/lib/lumberjack/formatter/id_formatter.rb +2 -1
  17. data/lib/lumberjack/formatter/inspect_formatter.rb +1 -1
  18. data/lib/lumberjack/formatter/object_formatter.rb +1 -1
  19. data/lib/lumberjack/formatter/pretty_print_formatter.rb +3 -1
  20. data/lib/lumberjack/formatter/string_formatter.rb +1 -1
  21. data/lib/lumberjack/formatter/strip_formatter.rb +1 -1
  22. data/lib/lumberjack/formatter/structured_formatter.rb +3 -1
  23. data/lib/lumberjack/formatter/truncate_formatter.rb +27 -0
  24. data/lib/lumberjack/formatter.rb +55 -9
  25. data/lib/lumberjack/log_entry.rb +10 -2
  26. data/lib/lumberjack/logger.rb +141 -18
  27. data/lib/lumberjack/rack/context.rb +1 -1
  28. data/lib/lumberjack/rack/request_id.rb +1 -1
  29. data/lib/lumberjack/rack/unit_of_work.rb +1 -1
  30. data/lib/lumberjack/rack.rb +1 -1
  31. data/lib/lumberjack/severity.rb +21 -1
  32. data/lib/lumberjack/tag_formatter.rb +19 -0
  33. data/lib/lumberjack/tagged_logger_support.rb +1 -1
  34. data/lib/lumberjack/tags.rb +6 -0
  35. data/lib/lumberjack/template.rb +15 -3
  36. data/lib/lumberjack.rb +20 -2
  37. metadata +8 -7
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  # Logger is a thread safe logging object. It has a compatible API with the Ruby
@@ -63,6 +63,9 @@ module Lumberjack
63
63
  # * :max_size - If the log device is a file path, it will be a Device::SizeRollingLogFile if this is set.
64
64
  #
65
65
  # All other options are passed to the device constuctor.
66
+ #
67
+ # @param [Lumberjack::Device, Object, Symbol, String] device The device to log to.
68
+ # @param [Hash] options The options for the logger.
66
69
  def initialize(device = $stdout, options = {})
67
70
  options = options.dup
68
71
  self.level = options.delete(:level) || INFO
@@ -83,11 +86,16 @@ module Lumberjack
83
86
  end
84
87
 
85
88
  # Get the timestamp format on the device if it has one.
89
+ #
90
+ # @return [String, nil] The timestamp format or nil if the device doesn't support it.
86
91
  def datetime_format
87
92
  device.datetime_format if device.respond_to?(:datetime_format)
88
93
  end
89
94
 
90
95
  # Set the timestamp format on the device if it is supported.
96
+ #
97
+ # @param [String] format The timestamp format.
98
+ # @return [void]
91
99
  def datetime_format=(format)
92
100
  if device.respond_to?(:datetime_format=)
93
101
  device.datetime_format = format
@@ -96,30 +104,44 @@ module Lumberjack
96
104
 
97
105
  # Get the level of severity of entries that are logged. Entries with a lower
98
106
  # severity level will be ignored.
107
+ #
108
+ # @return [Integer] The severity level.
99
109
  def level
100
110
  thread_local_value(:lumberjack_logger_level) || @level
101
111
  end
102
112
 
103
- alias sev_threshold level
113
+ alias_method :sev_threshold, :level
104
114
 
105
115
  # Set the log level using either an integer level like Logger::INFO or a label like
106
116
  # :info or "info"
117
+ #
118
+ # @param [Integer, Symbol, String] value The severity level.
119
+ # @return [void]
107
120
  def level=(value)
108
- @level = if value.is_a?(Integer)
109
- value
110
- else
111
- Severity.label_to_level(value)
112
- end
121
+ @level = Severity.coerce(value)
113
122
  end
114
123
 
115
- alias sev_threshold= level=
124
+ alias_method :sev_threshold=, :level=
125
+
126
+ # Adjust the log level during the block execution for the current Fiber only.
127
+ #
128
+ # @param [Integer, Symbol, String] severity The severity level.
129
+ # @return [Object] The result of the block.
130
+ def with_level(severity, &block)
131
+ push_thread_local_value(:lumberjack_logger_level, Severity.coerce(severity), &block)
132
+ end
116
133
 
117
134
  # Set the Lumberjack::Formatter used to format objects for logging as messages.
135
+ #
136
+ # @param [Lumberjack::Formatter, Object] value The formatter to use.
137
+ # @return [void]
118
138
  def formatter=(value)
119
139
  @_formatter = (value.is_a?(TaggedLoggerSupport::Formatter) ? value.__formatter : value)
120
140
  end
121
141
 
122
142
  # Get the Lumberjack::Formatter used to format objects for logging as messages.
143
+ #
144
+ # @return [Lumberjack::Formatter] The formatter.
123
145
  def formatter
124
146
  if respond_to?(:tagged)
125
147
  # Wrap in an object that supports ActiveSupport::TaggedLogger API
@@ -136,6 +158,8 @@ module Lumberjack
136
158
  # The tags added with this method are just strings so they are stored in the logger tags
137
159
  # in an array under the "tagged" tag. So calling `logger.tagged("foo", "bar")` will result
138
160
  # in tags `{"tagged" => ["foo", "bar"]}`.
161
+ #
162
+ # @return [Lumberjack::Logger] self.
139
163
  def tagged_logger!
140
164
  extend(TaggedLoggerSupport)
141
165
  self
@@ -149,7 +173,13 @@ module Lumberjack
149
173
  # The severity can be passed in either as one of the Severity constants,
150
174
  # or as a Severity label.
151
175
  #
152
- # === Example
176
+ # @param [Integer, Symbol, String] severity The severity of the message.
177
+ # @param [Object] message The message to log.
178
+ # @param [String] progname The name of the program that is logging the message.
179
+ # @param [Hash] tags The tags to add to the log entry.
180
+ # @return [void]
181
+ #
182
+ # @example
153
183
  #
154
184
  # logger.add_entry(Logger::ERROR, exception)
155
185
  # logger.add_entry(Logger::INFO, "Request completed")
@@ -191,6 +221,11 @@ module Lumberjack
191
221
  end
192
222
 
193
223
  # ::Logger compatible method to add a log entry.
224
+ #
225
+ # @param [Integer, Symbol, String] severity The severity of the message.
226
+ # @param [Object] message The message to log.
227
+ # @param [String] progname The name of the program that is logging the message.
228
+ # @return [void]
194
229
  def add(severity, message = nil, progname = nil, &block)
195
230
  if message.nil?
196
231
  if block
@@ -203,9 +238,11 @@ module Lumberjack
203
238
  add_entry(severity, message, progname)
204
239
  end
205
240
 
206
- alias log add
241
+ alias_method :log, :add
207
242
 
208
243
  # Flush the logging device. Messages are not guaranteed to be written until this method is called.
244
+ #
245
+ # @return [void]
209
246
  def flush
210
247
  device.flush
211
248
  @last_flushed_at = Time.now
@@ -213,102 +250,170 @@ module Lumberjack
213
250
  end
214
251
 
215
252
  # Close the logging device.
253
+ #
254
+ # @return [void]
216
255
  def close
217
256
  flush
218
257
  device.close if device.respond_to?(:close)
219
258
  @closed = true
220
259
  end
221
260
 
261
+ # Returns +true+ if the logging device is closed.
262
+ #
263
+ # @return [Boolean] +true+ if the logging device is closed.
222
264
  def closed?
223
265
  @closed
224
266
  end
225
267
 
268
+ # Reopen the logging device.
269
+ #
270
+ # @param [Object] logdev passed through to the logging device.
226
271
  def reopen(logdev = nil)
227
272
  @closed = false
228
273
  device.reopen(logdev) if device.respond_to?(:reopen)
229
274
  end
230
275
 
231
276
  # Log a +FATAL+ message. The message can be passed in either the +message+ argument or in a block.
277
+ #
278
+ # @param [Object] message_or_progname_or_tags The message to log or progname
279
+ # if the message is passed in a block.
280
+ # @param [String, Hash] progname_or_tags The name of the program that is logging the message or tags
281
+ # if the message is passed in a block.
282
+ # @return [void]
232
283
  def fatal(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
233
284
  call_add_entry(FATAL, message_or_progname_or_tags, progname_or_tags, &block)
234
285
  end
235
286
 
236
287
  # Return +true+ if +FATAL+ messages are being logged.
288
+ #
289
+ # @return [Boolean]
237
290
  def fatal?
238
291
  level <= FATAL
239
292
  end
240
293
 
241
294
  # Set the log level to fatal.
295
+ #
296
+ # @return [void]
242
297
  def fatal!
243
298
  self.level = FATAL
244
299
  end
245
300
 
246
301
  # Log an +ERROR+ message. The message can be passed in either the +message+ argument or in a block.
302
+ #
303
+ # @param [Object] message_or_progname_or_tags The message to log or progname
304
+ # if the message is passed in a block.
305
+ # @param [String, Hash] progname_or_tags The name of the program that is logging the message or tags
306
+ # if the message is passed in a block.
307
+ # @return [void]
247
308
  def error(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
248
309
  call_add_entry(ERROR, message_or_progname_or_tags, progname_or_tags, &block)
249
310
  end
250
311
 
251
312
  # Return +true+ if +ERROR+ messages are being logged.
313
+ #
314
+ # @return [Boolean]
252
315
  def error?
253
316
  level <= ERROR
254
317
  end
255
318
 
256
319
  # Set the log level to error.
320
+ #
321
+ # @return [void]
257
322
  def error!
258
323
  self.level = ERROR
259
324
  end
260
325
 
261
326
  # Log a +WARN+ message. The message can be passed in either the +message+ argument or in a block.
327
+ #
328
+ # @param [Object] message_or_progname_or_tags The message to log or progname
329
+ # if the message is passed in a block.
330
+ # @param [String, Hash] progname_or_tags The name of the program that is logging the message or tags
331
+ # if the message is passed in a block.
332
+ # @return [void]
262
333
  def warn(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
263
334
  call_add_entry(WARN, message_or_progname_or_tags, progname_or_tags, &block)
264
335
  end
265
336
 
266
337
  # Return +true+ if +WARN+ messages are being logged.
338
+ #
339
+ # @return [Boolean]
267
340
  def warn?
268
341
  level <= WARN
269
342
  end
270
343
 
271
344
  # Set the log level to warn.
345
+ #
346
+ # @return [void]
272
347
  def warn!
273
348
  self.level = WARN
274
349
  end
275
350
 
276
351
  # Log an +INFO+ message. The message can be passed in either the +message+ argument or in a block.
352
+ #
353
+ # @param [Object] message_or_progname_or_tags The message to log or progname
354
+ # if the message is passed in a block.
355
+ # @param [String] progname_or_tags The name of the program that is logging the message or tags
356
+ # if the message is passed in a block.
357
+ # @return [void]
277
358
  def info(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
278
359
  call_add_entry(INFO, message_or_progname_or_tags, progname_or_tags, &block)
279
360
  end
280
361
 
281
362
  # Return +true+ if +INFO+ messages are being logged.
363
+ #
364
+
282
365
  def info?
283
366
  level <= INFO
284
367
  end
285
368
 
286
369
  # Set the log level to info.
370
+ #
371
+ # @return [void]
287
372
  def info!
288
373
  self.level = INFO
289
374
  end
290
375
 
291
376
  # Log a +DEBUG+ message. The message can be passed in either the +message+ argument or in a block.
377
+ #
378
+ # @param [Object] message_or_progname_or_tags The message to log or progname
379
+ # if the message is passed in a block.
380
+ # @param [String, Hash] progname_or_tags The name of the program that is logging the message or tags
381
+ # if the message is passed in a block.
382
+ # @return [void]
292
383
  def debug(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
293
384
  call_add_entry(DEBUG, message_or_progname_or_tags, progname_or_tags, &block)
294
385
  end
295
386
 
296
387
  # Return +true+ if +DEBUG+ messages are being logged.
388
+ #
389
+ # @return [Boolean]
297
390
  def debug?
298
391
  level <= DEBUG
299
392
  end
300
393
 
301
394
  # Set the log level to debug.
395
+ #
396
+ # @return [void]
302
397
  def debug!
303
398
  self.level = DEBUG
304
399
  end
305
400
 
306
401
  # Log a message when the severity is not known. Unknown messages will always appear in the log.
307
402
  # The message can be passed in either the +message+ argument or in a block.
403
+ #
404
+ # @param [Object] message_or_progname_or_tags The message to log or progname
405
+ # if the message is passed in a block.
406
+ # @param [String, Hash] progname_or_tags The name of the program that is logging the message or tags
407
+ # if the message is passed in a block.
408
+ # @return [void]
308
409
  def unknown(message_or_progname_or_tags = nil, progname_or_tags = nil, &block)
309
410
  call_add_entry(UNKNOWN, message_or_progname_or_tags, progname_or_tags, &block)
310
411
  end
311
412
 
413
+ # Add a message when the severity is not known.
414
+ #
415
+ # @param [Object] msg The message to log.
416
+ # @return [void]
312
417
  def <<(msg)
313
418
  add_entry(UNKNOWN, msg)
314
419
  end
@@ -316,7 +421,10 @@ module Lumberjack
316
421
  # Silence the logger by setting a new log level inside a block. By default, only +ERROR+ or +FATAL+
317
422
  # messages will be logged.
318
423
  #
319
- # === Example
424
+ # @param [Integer, String, Symbol] temporary_level The log level to use inside the block.
425
+ # @return [Object] The result of the block.
426
+ #
427
+ # @example
320
428
  #
321
429
  # logger.level = Logger::INFO
322
430
  # logger.silence do
@@ -335,6 +443,9 @@ module Lumberjack
335
443
 
336
444
  # Set the program name that is associated with log messages. If a block
337
445
  # is given, the program name will be valid only within the block.
446
+ #
447
+ # @param [String] value The program name to use.
448
+ # @return [void]
338
449
  def set_progname(value, &block)
339
450
  if block
340
451
  push_thread_local_value(:lumberjack_logger_progname, value, &block)
@@ -344,6 +455,8 @@ module Lumberjack
344
455
  end
345
456
 
346
457
  # Get the program name associated with log messages.
458
+ #
459
+ # @return [String]
347
460
  def progname
348
461
  thread_local_value(:lumberjack_logger_progname) || @progname
349
462
  end
@@ -353,6 +466,9 @@ module Lumberjack
353
466
  # the tags will only be defined on the tags in that block. When the parent block
354
467
  # exits, all the tags will be reverted. If there is no block, then the tags will
355
468
  # be defined as global and apply to all log statements.
469
+ #
470
+ # @param [Hash] tags The tags to set.
471
+ # @return [void]
356
472
  def tag(tags, &block)
357
473
  tags = Tags.stringify_keys(tags)
358
474
  thread_tags = thread_local_value(:lumberjack_logger_tags)
@@ -371,6 +487,9 @@ module Lumberjack
371
487
  # Remove a tag from the current tag context. If this is called inside a block to a
372
488
  # call to `tag`, the tags will only be removed for the duration of that block. Otherwise
373
489
  # they will be removed from the global tags.
490
+ #
491
+ # @param [Array<String, Symbol>] tag_names The tags to remove.
492
+ # @return [void]
374
493
  def remove_tag(*tag_names)
375
494
  thread_tags = thread_local_value(:lumberjack_logger_tags)
376
495
  if thread_tags
@@ -382,6 +501,8 @@ module Lumberjack
382
501
 
383
502
  # Return all tags in scope on the logger including global tags set on the Lumberjack
384
503
  # context, tags set on the logger, and tags set on the current block for the logger.
504
+ #
505
+ # @return [Hash]
385
506
  def tags
386
507
  tags = {}
387
508
  context_tags = Lumberjack.context_tags
@@ -395,6 +516,8 @@ module Lumberjack
395
516
  # Remove all tags on the current logger and logging context within a block.
396
517
  # You can still set new block scoped tags within theuntagged block and provide
397
518
  # tags on individual log methods.
519
+ #
520
+ # @return [void]
398
521
  def untagged(&block)
399
522
  Lumberjack.use_context(nil) do
400
523
  scope_tags = thread_local_value(:lumberjack_logger_tags)
@@ -413,7 +536,7 @@ module Lumberjack
413
536
  private
414
537
 
415
538
  # 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:
539
+ def call_add_entry(severity, message_or_progname_or_tags, progname_or_tags, &block) # :nodoc:
417
540
  message = nil
418
541
  progname = nil
419
542
  tags = nil
@@ -438,7 +561,7 @@ module Lumberjack
438
561
  end
439
562
 
440
563
  # Set a local value for a thread tied to this object.
441
- def set_thread_local_value(name, value) #:nodoc:
564
+ def set_thread_local_value(name, value) # :nodoc:
442
565
  values = Thread.current[name]
443
566
  unless values
444
567
  values = {}
@@ -453,13 +576,13 @@ module Lumberjack
453
576
  end
454
577
 
455
578
  # Get a local value for a thread tied to this object.
456
- def thread_local_value(name) #:nodoc:
579
+ def thread_local_value(name) # :nodoc:
457
580
  values = Thread.current[name]
458
581
  values[self] if values
459
582
  end
460
583
 
461
584
  # Set a local value for a thread tied to this object within a block.
462
- def push_thread_local_value(name, value) #:nodoc:
585
+ def push_thread_local_value(name, value) # :nodoc:
463
586
  save_val = thread_local_value(name)
464
587
  set_thread_local_value(name, value)
465
588
  begin
@@ -470,7 +593,7 @@ module Lumberjack
470
593
  end
471
594
 
472
595
  # Open a logging device.
473
- def open_device(device, options) #:nodoc:
596
+ def open_device(device, options) # :nodoc:
474
597
  if device.nil?
475
598
  nil
476
599
  elsif device.is_a?(Device)
@@ -491,7 +614,7 @@ module Lumberjack
491
614
  end
492
615
  end
493
616
 
494
- def write_to_device(entry) #:nodoc:
617
+ def write_to_device(entry) # :nodoc:
495
618
  device.write(entry)
496
619
  rescue => e
497
620
  # rubocop:disable Style/StderrPuts
@@ -501,7 +624,7 @@ module Lumberjack
501
624
  end
502
625
 
503
626
  # Create a thread that will periodically call flush.
504
- def create_flusher_thread(flush_seconds) #:nodoc:
627
+ def create_flusher_thread(flush_seconds) # :nodoc:
505
628
  if flush_seconds > 0
506
629
  begin
507
630
  logger = self
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  module Rack
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  module Rack
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  module Rack
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  module Rack
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  # The standard severity levels for logging messages.
@@ -14,13 +14,33 @@ module Lumberjack
14
14
  SEVERITY_LABELS = %w[DEBUG INFO WARN ERROR FATAL UNKNOWN].freeze
15
15
 
16
16
  class << self
17
+ # Convert a severity level to a label.
18
+ #
19
+ # @param [Integer] severity The severity level to convert.
20
+ # @return [String] The severity label.
17
21
  def level_to_label(severity)
18
22
  SEVERITY_LABELS[severity] || SEVERITY_LABELS.last
19
23
  end
20
24
 
25
+ # Convert a severity label to a level.
26
+ #
27
+ # @param [String, Symbol] label The severity label to convert.
28
+ # @return [Integer] The severity level.
21
29
  def label_to_level(label)
22
30
  SEVERITY_LABELS.index(label.to_s.upcase) || UNKNOWN
23
31
  end
32
+
33
+ # Coerce a value to a severity level.
34
+ #
35
+ # @param [Integer, String, Symbol] value The value to coerce.
36
+ # @return [Integer] The severity level.
37
+ def coerce(value)
38
+ if value.is_a?(Integer)
39
+ value
40
+ else
41
+ label_to_level(value)
42
+ end
43
+ end
24
44
  end
25
45
  end
26
46
  end
@@ -16,6 +16,10 @@ module Lumberjack
16
16
 
17
17
  # Add a default formatter applied to all tag values. This can either be a Lumberjack::Formatter
18
18
  # or an object that responds to `call` or a block.
19
+ #
20
+ # @param [Lumberjack::Formatter, #call, nil] formatter The formatter to use.
21
+ # If this is nil, then the block will be used as the formatter.
22
+ # @return [Lumberjack::TagFormatter] self
19
23
  def default(formatter = nil, &block)
20
24
  formatter ||= block
21
25
  formatter = dereference_formatter(formatter)
@@ -24,6 +28,8 @@ module Lumberjack
24
28
  end
25
29
 
26
30
  # Remove the default formatter.
31
+ #
32
+ # @return [Lumberjack::TagFormatter] self
27
33
  def remove_default
28
34
  @default_formatter = nil
29
35
  self
@@ -32,6 +38,11 @@ module Lumberjack
32
38
  # Add a formatter for specific tag names. This can either be a Lumberjack::Formatter
33
39
  # or an object that responds to `call` or a block. The default formatter will not be
34
40
  # applied.
41
+ #
42
+ # @param [String, Array<String>] names The tag names to apply the formatter to.
43
+ # @param [Lumberjack::Formatter, #call, nil] formatter The formatter to use.
44
+ # If this is nil, then the block will be used as the formatter.
45
+ # @return [Lumberjack::TagFormatter] self
35
46
  def add(names, formatter = nil, &block)
36
47
  formatter ||= block
37
48
  formatter = dereference_formatter(formatter)
@@ -46,6 +57,9 @@ module Lumberjack
46
57
  end
47
58
 
48
59
  # Remove formatters for specific tag names. The default formatter will still be applied.
60
+ #
61
+ # @param [String, Array<String>] names The tag names to remove the formatter from.
62
+ # @return [Lumberjack::TagFormatter] self
49
63
  def remove(names)
50
64
  Array(names).each do |name|
51
65
  @formatters.delete(name.to_s)
@@ -54,6 +68,8 @@ module Lumberjack
54
68
  end
55
69
 
56
70
  # Remove all formatters.
71
+ #
72
+ # @return [Lumberjack::TagFormatter] self
57
73
  def clear
58
74
  @default_formatter = nil
59
75
  @formatters.clear
@@ -61,6 +77,9 @@ module Lumberjack
61
77
  end
62
78
 
63
79
  # Format a hash of tags using the formatters
80
+ #
81
+ # @param [Hash] tags The tags to format.
82
+ # @return [Hash] The formatted tags.
64
83
  def format(tags)
65
84
  return nil if tags.nil?
66
85
  if @default_formatter.nil? && (@formatters.empty? || (@formatters.keys & tags.keys).empty?)
@@ -55,7 +55,7 @@ module Lumberjack
55
55
 
56
56
  def pop_tags(size = 1)
57
57
  tagged_values = Array(@tags["tagged"])
58
- tagged_values = (tagged_values.size > size ? tagged_values[0, tagged_values.size - size] : nil)
58
+ tagged_values = ((tagged_values.size > size) ? tagged_values[0, tagged_values.size - size] : nil)
59
59
  tag("tagged" => tagged_values)
60
60
  end
61
61
 
@@ -5,6 +5,9 @@ module Lumberjack
5
5
  class << self
6
6
  # Transform hash keys to strings. This method exists for optimization and backward compatibility.
7
7
  # If a hash already has string keys, it will be returned as is.
8
+ #
9
+ # @param [Hash] hash The hash to transform.
10
+ # @return [Hash] The hash with string keys.
8
11
  def stringify_keys(hash)
9
12
  return nil if hash.nil?
10
13
  if hash.keys.all? { |key| key.is_a?(String) }
@@ -22,6 +25,9 @@ module Lumberjack
22
25
 
23
26
  # Ensure keys are strings and expand any values in a hash that are Proc's by calling them and replacing
24
27
  # the value with the result. This allows setting global tags with runtime values.
28
+ #
29
+ # @param [Hash] hash The hash to transform.
30
+ # @return [Hash] The hash with string keys and expanded values.
25
31
  def expand_runtime_values(hash)
26
32
  return nil if hash.nil?
27
33
  if hash.all? { |key, value| key.is_a?(String) && !value.is_a?(Proc) }
@@ -1,4 +1,4 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Lumberjack
4
4
  # A template converts entries to strings. Templates can contain the following place holders to
@@ -30,6 +30,9 @@ module Lumberjack
30
30
  # specified precision.
31
31
  #
32
32
  # Messages will have white space stripped from both ends.
33
+ #
34
+ # @param [String] first_line The template to use to format the first line of a message.
35
+ # @param [Hash] options The options for the template.
33
36
  def initialize(first_line, options = {})
34
37
  @first_line_template, @first_line_tags = compile(first_line)
35
38
  additional_lines = options[:additional_lines] || "#{Lumberjack::LINE_SEPARATOR}:message"
@@ -39,6 +42,9 @@ module Lumberjack
39
42
  self.datetime_format = (options[:time_format] || :milliseconds)
40
43
  end
41
44
 
45
+ # Set the format used to format the time.
46
+ #
47
+ # @param [String] format The format to use to format the time.
42
48
  def datetime_format=(format)
43
49
  if format == :milliseconds
44
50
  format = MILLISECOND_TIME_FORMAT
@@ -48,11 +54,17 @@ module Lumberjack
48
54
  @time_formatter = Formatter::DateTimeFormatter.new(format)
49
55
  end
50
56
 
57
+ # Get the format used to format the time.
58
+ #
59
+ # @return [String]
51
60
  def datetime_format
52
61
  @time_formatter.format
53
62
  end
54
63
 
55
64
  # Convert an entry into a string using the template.
65
+ #
66
+ # @param [Lumberjack::LogEntry] entry The entry to convert to a string.
67
+ # @return [String] The entry converted to a string.
56
68
  def call(entry)
57
69
  return entry unless entry.is_a?(LogEntry)
58
70
 
@@ -86,7 +98,7 @@ module Lumberjack
86
98
  def tag_args(tags, tag_vars)
87
99
  return [nil] * (tag_vars.size + 1) if tags.nil? || tags.size == 0
88
100
 
89
- tags_string = ""
101
+ tags_string = +""
90
102
  tags.each do |name, value|
91
103
  unless value.nil? || tag_vars.include?(name)
92
104
  value = value.to_s
@@ -103,7 +115,7 @@ module Lumberjack
103
115
  end
104
116
 
105
117
  # Compile the template string into a value that can be used with sprintf.
106
- def compile(template) #:nodoc:
118
+ def compile(template) # :nodoc:
107
119
  tag_vars = []
108
120
  template = template.gsub(PLACEHOLDER_PATTERN) do |match|
109
121
  var_name = match.sub("{", "").sub("}", "")