lumberjack 1.2.7 → 1.2.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ba28430c423311445a80559e0bd6fdfbfdfed90edcd4dda89d9e5d635d75ec9
4
- data.tar.gz: 5507d016ad2b7dcf13e38616496e2b9e5c18e456eb1ad6bdfeceb66386eae403
3
+ metadata.gz: c7912cf1bfe32dcaa911a6a65a0b755fb3051eebc2a7e4a65ff5d422f2f61ad7
4
+ data.tar.gz: b4077d2ef97be7169ed0e7bca7d107ec3f42372dde45cae1e7cdcedae1fb4e61
5
5
  SHA512:
6
- metadata.gz: 7bf2c9640012487f994d8e4eaabf85e9b4a3fbae828d0a0bccab71cfa7af8820da199b72d04764db4b6d9e7439ac620f49578b0a20b8c77c01f4ea496616ff4c
7
- data.tar.gz: fb7d9b44ca1bbbd1a2727252c5b9f8885f8a374cd24e0fa34f38b9fca2cfa0444d603d15ccdec743c247251c0622d9153ecbe1b0d9c609da24b38511957ba190
6
+ metadata.gz: a092775aec0c7670eda8ff4959a7cc928a57b0934ecc8a1190efe395b437bc0a681bdbd2f3455b98f3cf757904f5f39b31c96e24e9c8bcd7a481b806027e92c8
7
+ data.tar.gz: 885f76da2738f3f6236a363d9a7dea68f83a80a03e123a3c52c578984f963e959de6fd60d0fd222d9a9933c22ed959181538abb4118163c8fd6528292e88673c
@@ -1,10 +1,15 @@
1
+ ## 1.2.8
2
+
3
+ * Add `Logger#untagged` to remove previously set logging tags from a block.
4
+ * Return result of the block when a block is passed to `Logger#tag`.
5
+
1
6
  ## 1.2.7
2
7
 
3
- * Allow passing frozen hashes to `Logger.tag`. Tags passed to this method are now duplicated so the logger maintains it's own copy of the hash.
8
+ * Allow passing frozen hashes to `Logger#tag`. Tags passed to this method are now duplicated so the logger maintains it's own copy of the hash.
4
9
 
5
10
  ## 1.2.6
6
11
 
7
- * Fix Logger#tag so it only ads to the current block's logger tags instead of the global tags if called inside a `Logger#tag` block.
12
+ * Fix `Logger#tag` so it only ads to the current block's logger tags instead of the global tags if called inside a `Logger#tag` block.
8
13
  * Add Logger#remove_tag
9
14
 
10
15
  ## 1.2.5
@@ -14,7 +19,7 @@
14
19
 
15
20
  ## 1.2.4
16
21
 
17
- * Enhance ActiveSupport::TaggedLogging support so code that Lumberjack loggers can be wrapped with a tagged logger.
22
+ * Enhance `ActiveSupport::TaggedLogging` support so code that Lumberjack loggers can be wrapped with a tagged logger.
18
23
 
19
24
  ## 1.2.3
20
25
 
@@ -30,7 +35,7 @@
30
35
 
31
36
  ## 1.2.0
32
37
 
33
- * Enable compatibility with ActiveSupport::TaggedLogger by calling `tagged_logger!` on a logger.
38
+ * Enable compatibility with `ActiveSupport::TaggedLogger` by calling `tagged_logger!` on a logger.
34
39
  * Add `tag_formatter` to logger to specify formatting of tags for output.
35
40
  * Allow adding and removing classes by name to formatters.
36
41
  * Allow adding and removing multiple classes in a single call to a formatter.
@@ -49,7 +54,7 @@
49
54
 
50
55
  ## 1.1.0
51
56
 
52
- * Change Lumberjack::Logger to inherit from ::Logger
57
+ * Change `Lumberjack::Logger` to inherit from ::Logger
53
58
  * Add support for tags on log messages
54
59
  * Add global tag context for all loggers
55
60
  * Add per logger tags and tag contexts
@@ -57,8 +62,8 @@
57
62
  * Add support for setting datetime format on log devices
58
63
  * Performance optimizations
59
64
  * Add Multi device to output to multiple devices
60
- * Add DateTimeFormatter, IdFormatter, ObjectFormatter, and StructuredFormatter
61
- * Add rack Context middleware for setting thread global context
65
+ * Add `DateTimeFormatter`, `IdFormatter`, `ObjectFormatter`, and `StructuredFormatter`
66
+ * Add rack `Context` middleware for setting thread global context
62
67
  * End support for ruby versions < 2.3
63
68
  * Add support for modules in formatters
64
69
 
@@ -70,7 +75,7 @@
70
75
 
71
76
  ## 1.0.12
72
77
 
73
- * Add support for ActionDispatch request id for better Rails compatibility.
78
+ * Add support for `ActionDispatch` request id for better Rails compatibility.
74
79
 
75
80
  ## 1.0.11
76
81
 
@@ -84,11 +89,11 @@
84
89
 
85
90
  ## 1.0.9
86
91
 
87
- * Add method so Formatter is compatible with ActiveSupport logging extensions.
92
+ * Add method so Formatter is compatible with `ActiveSupport` logging extensions.
88
93
 
89
94
  ## 1.0.8
90
95
 
91
- * Fix another internal variable name conflict with ActiveSupport logging extensions.
96
+ * Fix another internal variable name conflict with `ActiveSupport` logging extensions.
92
97
 
93
98
  ## 1.0.7
94
99
 
@@ -96,7 +101,7 @@
96
101
 
97
102
  ## 1.0.6
98
103
 
99
- * Fix internal variable name conflict with ActiveSupport logging extensions.
104
+ * Fix internal variable name conflict with `ActiveSupport` logging extensions.
100
105
 
101
106
  ## 1.0.5
102
107
 
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
- # Lumberjack
2
-
3
- [![Build Status](https://travis-ci.org/bdurand/lumberjack.svg?branch=master)](https://travis-ci.org/bdurand/lumberjack)
1
+ ![Continuous Integration](https://github.com/bdurand/lumberjack/workflows/Continuous%20Integration/badge.svg)
4
2
  [![Maintainability](https://api.codeclimate.com/v1/badges/a0abc03721fff9b0cde1/maintainability)](https://codeclimate.com/github/bdurand/lumberjack/maintainability)
3
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
4
+
5
+ # Lumberjack
5
6
 
6
7
  Lumberjack is a simple, powerful, and fast logging implementation in Ruby. It uses nearly the same API as the Logger class in the Ruby standard library and as ActiveSupport::BufferedLogger in Rails.
7
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.7
1
+ 1.2.8
@@ -1,27 +1,26 @@
1
1
  # frozen_string_literals: true
2
2
 
3
- require 'rbconfig'
4
- require 'time'
5
- require 'thread'
6
- require 'securerandom'
7
- require 'logger'
3
+ require "rbconfig"
4
+ require "time"
5
+ require "securerandom"
6
+ require "logger"
8
7
 
9
8
  module Lumberjack
10
- LINE_SEPARATOR = (RbConfig::CONFIG['host_os'].match(/mswin/i) ? "\r\n" : "\n")
9
+ LINE_SEPARATOR = (RbConfig::CONFIG["host_os"] =~ /mswin/i ? "\r\n" : "\n")
11
10
 
12
- require_relative "lumberjack/severity.rb"
13
- require_relative "lumberjack/formatter.rb"
11
+ require_relative "lumberjack/severity"
12
+ require_relative "lumberjack/formatter"
14
13
 
15
- require_relative "lumberjack/context.rb"
16
- require_relative "lumberjack/log_entry.rb"
17
- require_relative "lumberjack/device.rb"
18
- require_relative "lumberjack/logger.rb"
19
- require_relative "lumberjack/tags.rb"
20
- require_relative "lumberjack/tag_formatter.rb"
21
- require_relative "lumberjack/tagged_logger_support.rb"
22
- require_relative "lumberjack/tagged_logging.rb"
23
- require_relative "lumberjack/template.rb"
24
- require_relative "lumberjack/rack.rb"
14
+ require_relative "lumberjack/context"
15
+ require_relative "lumberjack/log_entry"
16
+ require_relative "lumberjack/device"
17
+ require_relative "lumberjack/logger"
18
+ require_relative "lumberjack/tags"
19
+ require_relative "lumberjack/tag_formatter"
20
+ require_relative "lumberjack/tagged_logger_support"
21
+ require_relative "lumberjack/tagged_logging"
22
+ require_relative "lumberjack/template"
23
+ require_relative "lumberjack/rack"
25
24
 
26
25
  class << self
27
26
  # Define a unit of work within a block. Within the block supplied to this
@@ -54,20 +53,26 @@ module Lumberjack
54
53
  #
55
54
  # Otherwise, it will return the current context. If one doesn't exist, it will return a new one
56
55
  # but that context will not be in any scope.
57
- def context
56
+ def context(&block)
58
57
  current_context = Thread.current[:lumberjack_context]
59
- if block_given?
60
- Thread.current[:lumberjack_context] = Context.new(current_context)
61
- begin
62
- yield
63
- ensure
64
- Thread.current[:lumberjack_context] = current_context
65
- end
58
+ if block
59
+ use_context(Context.new(current_context), &block)
66
60
  else
67
61
  current_context || Context.new
68
62
  end
69
63
  end
70
-
64
+
65
+ # Set the context to use within a block.
66
+ def use_context(context, &block)
67
+ current_context = Thread.current[:lumberjack_context]
68
+ begin
69
+ Thread.current[:lumberjack_context] = (context || Context.new)
70
+ yield
71
+ ensure
72
+ Thread.current[:lumberjack_context] = current_context
73
+ end
74
+ end
75
+
71
76
  # Return true if inside a context block.
72
77
  def context?
73
78
  !!Thread.current[:lumberjack_context]
@@ -76,14 +81,13 @@ module Lumberjack
76
81
  # Return the tags from the current context or nil if there are no tags.
77
82
  def context_tags
78
83
  context = Thread.current[:lumberjack_context]
79
- context.tags if context
84
+ context&.tags
80
85
  end
81
86
 
82
87
  # Set tags on the current context
83
88
  def tag(tags)
84
89
  context = Thread.current[:lumberjack_context]
85
- context.tag(tags) if context
90
+ context&.tag(tags)
86
91
  end
87
-
88
92
  end
89
93
  end
@@ -4,37 +4,37 @@ module Lumberjack
4
4
  # This is an abstract class for logging devices. Subclasses must implement the +write+ method and
5
5
  # may implement the +close+ and +flush+ methods if applicable.
6
6
  class Device
7
- require_relative "device/writer.rb"
8
- require_relative "device/log_file.rb"
9
- require_relative "device/rolling_log_file.rb"
10
- require_relative "device/date_rolling_log_file.rb"
11
- require_relative "device/size_rolling_log_file.rb"
12
- require_relative "device/multi.rb"
13
- require_relative "device/null.rb"
7
+ require_relative "device/writer"
8
+ require_relative "device/log_file"
9
+ require_relative "device/rolling_log_file"
10
+ require_relative "device/date_rolling_log_file"
11
+ require_relative "device/size_rolling_log_file"
12
+ require_relative "device/multi"
13
+ require_relative "device/null"
14
14
 
15
15
  # Subclasses must implement this method to write a LogEntry.
16
16
  def write(entry)
17
17
  raise NotImplementedError
18
18
  end
19
-
19
+
20
20
  # Subclasses may implement this method to close the device.
21
21
  def close
22
22
  flush
23
23
  end
24
-
24
+
25
25
  # Subclasses may implement this method to reopen the device.
26
26
  def reopen(logdev = nil)
27
27
  flush
28
28
  end
29
-
29
+
30
30
  # Subclasses may implement this method to flush any buffers used by the device.
31
31
  def flush
32
32
  end
33
-
33
+
34
34
  # Subclasses may implement this method to get the format for log timestamps.
35
35
  def datetime_format
36
36
  end
37
-
37
+
38
38
  # Subclasses may implement this method to set a format for log timestamps.
39
39
  def datetime_format=(format)
40
40
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literals: true
2
2
 
3
- require 'date'
3
+ require "date"
4
4
 
5
5
  module Lumberjack
6
6
  class Device
@@ -16,7 +16,7 @@ module Lumberjack
16
16
  def initialize(path, options = {})
17
17
  @manual = options[:manual]
18
18
  @file_date = Date.today
19
- if options[:roll] && options[:roll].to_s.match(/(daily)|(weekly)|(monthly)/i)
19
+ if options[:roll]&.to_s&.match(/(daily)|(weekly)|(monthly)/i)
20
20
  @roll_period = $~[0].downcase.to_sym
21
21
  options.delete(:roll)
22
22
  else
@@ -28,11 +28,11 @@ module Lumberjack
28
28
  def archive_file_suffix
29
29
  case @roll_period
30
30
  when :weekly
31
- "#{@file_date.strftime('week-of-%Y-%m-%d')}"
31
+ @file_date.strftime("week-of-%Y-%m-%d").to_s
32
32
  when :monthly
33
- "#{@file_date.strftime('%Y-%m')}"
33
+ @file_date.strftime("%Y-%m").to_s
34
34
  else
35
- "#{@file_date.strftime('%Y-%m-%d')}"
35
+ @file_date.strftime("%Y-%m-%d").to_s
36
36
  end
37
37
  end
38
38
 
@@ -54,9 +54,9 @@ module Lumberjack
54
54
  end
55
55
  end
56
56
  end
57
-
57
+
58
58
  protected
59
-
59
+
60
60
  def after_roll
61
61
  @file_date = Date.today
62
62
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literals: true
2
2
 
3
- require 'fileutils'
3
+ require "fileutils"
4
4
 
5
5
  module Lumberjack
6
6
  class Device
@@ -10,23 +10,23 @@ module Lumberjack
10
10
 
11
11
  # The absolute path of the file being logged to.
12
12
  attr_reader :path
13
-
13
+
14
14
  # Create a logger to the file at +path+. Options are passed through to the Writer constructor.
15
15
  def initialize(path, options = {})
16
16
  @path = File.expand_path(path)
17
17
  FileUtils.mkdir_p(File.dirname(@path))
18
18
  super(file_stream, options)
19
19
  end
20
-
20
+
21
21
  def reopen(logdev = nil)
22
22
  close
23
23
  @stream = file_stream
24
24
  end
25
-
25
+
26
26
  private
27
-
27
+
28
28
  def file_stream
29
- File.new(@path, 'a', :encoding => EXTERNAL_ENCODING)
29
+ File.new(@path, "a", encoding: EXTERNAL_ENCODING)
30
30
  end
31
31
  end
32
32
  end
@@ -7,35 +7,35 @@ module Lumberjack
7
7
  def initialize(*devices)
8
8
  @devices = devices.flatten
9
9
  end
10
-
10
+
11
11
  def write(entry)
12
12
  @devices.each do |device|
13
13
  device.write(entry)
14
14
  end
15
15
  end
16
-
16
+
17
17
  def flush
18
18
  @devices.each do |device|
19
19
  device.flush
20
20
  end
21
21
  end
22
-
22
+
23
23
  def close
24
24
  @devices.each do |device|
25
25
  device.close
26
26
  end
27
27
  end
28
-
28
+
29
29
  def reopen(logdev = nil)
30
30
  @devices.each do |device|
31
31
  device.reopen(logdev = nil)
32
32
  end
33
33
  end
34
-
34
+
35
35
  def datetime_format
36
36
  @devices.detect(&:datetime_format).datetime_format
37
37
  end
38
-
38
+
39
39
  def datetime_format=(format)
40
40
  @devices.each do |device|
41
41
  device.datetime_format = format
@@ -7,7 +7,7 @@ module Lumberjack
7
7
  class Null < Device
8
8
  def initialize(*args)
9
9
  end
10
-
10
+
11
11
  def write(entry)
12
12
  end
13
13
  end
@@ -14,35 +14,43 @@ module Lumberjack
14
14
  class RollingLogFile < LogFile
15
15
  attr_reader :path
16
16
  attr_accessor :keep
17
-
17
+
18
18
  def initialize(path, options = {})
19
19
  @path = File.expand_path(path)
20
20
  @keep = options[:keep]
21
21
  super(path, options)
22
- @file_inode = stream.lstat.ino rescue nil
22
+ @file_inode = begin
23
+ stream.lstat.ino
24
+ rescue
25
+ nil
26
+ end
23
27
  @@rolls = []
24
28
  @next_stat_check = Time.now.to_f
25
29
  @min_roll_check = (options[:min_roll_check] || 1.0).to_f
26
30
  end
27
-
31
+
28
32
  # Returns a suffix that will be appended to the file name when it is archived.. The suffix should
29
33
  # change after it is time to roll the file. The log file will be renamed when it is rolled.
30
34
  def archive_file_suffix
31
35
  raise NotImplementedError
32
36
  end
33
-
37
+
34
38
  # Return +true+ if the file should be rolled.
35
39
  def roll_file?
36
40
  raise NotImplementedError
37
41
  end
38
-
42
+
39
43
  # Roll the log file by renaming it to the archive file name and then re-opening a stream to the log
40
44
  # file path. Rolling a file is safe in multi-threaded or multi-process environments.
41
45
  def roll_file! #:nodoc:
42
46
  do_once(stream) do
43
47
  archive_file = "#{path}.#{archive_file_suffix}"
44
48
  stream.flush
45
- current_inode = File.stat(path).ino rescue nil
49
+ current_inode = begin
50
+ File.stat(path).ino
51
+ rescue
52
+ nil
53
+ end
46
54
  if @file_inode && current_inode == @file_inode && !File.exist?(archive_file) && File.exist?(path)
47
55
  begin
48
56
  File.rename(path, archive_file)
@@ -59,41 +67,49 @@ module Lumberjack
59
67
  end
60
68
 
61
69
  protected
62
-
70
+
63
71
  # This method will be called after a file has been rolled. Subclasses can
64
72
  # implement code to reset the state of the device. This method is thread safe.
65
73
  def after_roll
66
74
  end
67
-
75
+
68
76
  # Handle rolling the file before flushing.
69
77
  def before_flush # :nodoc:
70
78
  if @min_roll_check <= 0.0 || Time.now.to_f >= @next_stat_check
71
79
  @next_stat_check += @min_roll_check
72
- path_inode = File.lstat(path).ino rescue nil
80
+ path_inode = begin
81
+ File.lstat(path).ino
82
+ rescue
83
+ nil
84
+ end
73
85
  if path_inode != @file_inode
74
86
  @file_inode = path_inode
75
87
  reopen_file
76
- else
77
- roll_file! if roll_file?
88
+ elsif roll_file?
89
+ roll_file!
78
90
  end
79
91
  end
80
92
  end
81
-
93
+
82
94
  private
83
95
 
84
96
  def reopen_file
85
97
  old_stream = stream
86
- new_stream = File.open(path, 'a', encoding: EXTERNAL_ENCODING)
98
+ new_stream = File.open(path, "a", encoding: EXTERNAL_ENCODING)
87
99
  new_stream.sync = true if buffer_size > 0
88
- @file_inode = new_stream.lstat.ino rescue nil
100
+ @file_inode = begin
101
+ new_stream.lstat.ino
102
+ rescue
103
+ nil
104
+ end
89
105
  self.stream = new_stream
90
106
  old_stream.close
91
107
  end
92
108
  end
93
-
109
+
94
110
  def cleanup_files!
95
111
  if keep
96
- files = Dir.glob("#{path}.*").collect{|f| [f, File.ctime(f)]}.sort{|a,b| b.last <=> a.last}.collect{|a| a.first}
112
+ files = Dir.glob("#{path}.*").collect { |f| [f, File.ctime(f)] }.sort { |a, b| b.last <=> a.last }.collect { |a| a.first }
97
113
  if files.size > keep
98
114
  files[keep, files.length].each do |f|
99
115
  File.delete(f)
@@ -101,7 +117,7 @@ module Lumberjack
101
117
  end
102
118
  end
103
119
  end
104
-
120
+
105
121
  def do_once(file)
106
122
  begin
107
123
  file.flock(File::LOCK_EX)
@@ -110,11 +126,19 @@ module Lumberjack
110
126
  return
111
127
  end
112
128
  begin
113
- verify = file.lstat rescue nil
129
+ verify = begin
130
+ file.lstat
131
+ rescue
132
+ nil
133
+ end
114
134
  # Execute only if the file we locked is still the same one that needed to be rolled
115
135
  yield if verify && verify.ino == @file_inode && verify.size > 0
116
136
  ensure
117
- file.flock(File::LOCK_UN) rescue nil
137
+ begin
138
+ file.flock(File::LOCK_UN)
139
+ rescue
140
+ nil
141
+ end
118
142
  end
119
143
  end
120
144
  end
@@ -8,30 +8,30 @@ module Lumberjack
8
8
  # production.log.1, then production.log.2, etc.
9
9
  class SizeRollingLogFile < RollingLogFile
10
10
  attr_reader :max_size
11
-
11
+
12
12
  # Create an new log device to the specified file. The maximum size of the log file is specified with
13
13
  # the :max_size option. The unit can also be specified: "32K", "100M", "2G" are all valid.
14
14
  def initialize(path, options = {})
15
15
  @manual = options[:manual]
16
16
  @max_size = options[:max_size]
17
17
  if @max_size.is_a?(String)
18
- if @max_size.match(/^(\d+(\.\d+)?)([KMG])?$/i)
18
+ if @max_size =~ /^(\d+(\.\d+)?)([KMG])?$/i
19
19
  @max_size = $~[1].to_f
20
20
  units = $~[3].to_s.upcase
21
21
  case units
22
22
  when "K"
23
23
  @max_size *= 1024
24
24
  when "M"
25
- @max_size *= 1024 ** 2
25
+ @max_size *= 1024**2
26
26
  when "G"
27
- @max_size *= 1024 ** 3
27
+ @max_size *= 1024**3
28
28
  end
29
29
  @max_size = @max_size.round
30
30
  else
31
31
  raise ArgumentError.new("illegal value for :max_size (#{@max_size})")
32
32
  end
33
33
  end
34
-
34
+
35
35
  super
36
36
  end
37
37
 
@@ -44,15 +44,15 @@ module Lumberjack
44
44
  rescue SystemCallError
45
45
  false
46
46
  end
47
-
47
+
48
48
  protected
49
-
49
+
50
50
  # Calculate the next archive file name extension.
51
51
  def next_archive_number # :nodoc:
52
52
  max = 0
53
53
  Dir.glob("#{path}.*").each do |filename|
54
- if filename.match(/\.\d+$/)
55
- suffix = filename.split('.').last.to_i
54
+ if /\.\d+\z/ =~ filename
55
+ suffix = filename.split(".").last.to_i
56
56
  max = suffix if suffix > max
57
57
  end
58
58
  end
@@ -71,7 +71,7 @@ module Lumberjack
71
71
  @template = template
72
72
  else
73
73
  additional_lines = (options[:additional_lines] || DEFAULT_ADDITIONAL_LINES_TEMPLATE)
74
- @template = Template.new(template, :additional_lines => additional_lines, :time_format => options[:time_format])
74
+ @template = Template.new(template, additional_lines: additional_lines, time_format: options[:time_format])
75
75
  end
76
76
  end
77
77
 
@@ -133,14 +133,10 @@ module Lumberjack
133
133
  protected
134
134
 
135
135
  # Set the underlying stream.
136
- def stream=(stream)
137
- @stream = stream
138
- end
136
+ attr_writer :stream
139
137
 
140
138
  # Get the underlying stream.
141
- def stream
142
- @stream
143
- end
139
+ attr_reader :stream
144
140
 
145
141
  private
146
142
 
@@ -149,10 +145,10 @@ module Lumberjack
149
145
  lines = lines.first if lines.is_a?(Array) && lines.size == 1
150
146
 
151
147
  out = nil
152
- if lines.is_a?(Array)
153
- out = "#{lines.join(Lumberjack::LINE_SEPARATOR)}#{Lumberjack::LINE_SEPARATOR}"
148
+ out = if lines.is_a?(Array)
149
+ "#{lines.join(Lumberjack::LINE_SEPARATOR)}#{Lumberjack::LINE_SEPARATOR}"
154
150
  else
155
- out = "#{lines}#{Lumberjack::LINE_SEPARATOR}"
151
+ "#{lines}#{Lumberjack::LINE_SEPARATOR}"
156
152
  end
157
153
 
158
154
  begin
@@ -170,9 +166,13 @@ module Lumberjack
170
166
  end
171
167
  end
172
168
  end
173
- stream.flush rescue nil
169
+ begin
170
+ stream.flush
171
+ rescue
172
+ nil
173
+ end
174
174
  rescue => e
175
- $stderr.write("#{e.class.name}: #{e.message}#{' at ' + e.backtrace.first if e.backtrace}")
175
+ $stderr.write("#{e.class.name}: #{e.message}#{" at " + e.backtrace.first if e.backtrace}")
176
176
  $stderr.write(out)
177
177
  $stderr.flush
178
178
  end
@@ -12,15 +12,15 @@ module Lumberjack
12
12
  #
13
13
  # Enumerable objects (including Hash and Array) will call the formatter recursively for each element.
14
14
  class Formatter
15
- require_relative "formatter/date_time_formatter.rb"
16
- require_relative "formatter/exception_formatter.rb"
17
- require_relative "formatter/id_formatter.rb"
18
- require_relative "formatter/inspect_formatter.rb"
19
- require_relative "formatter/object_formatter.rb"
20
- require_relative "formatter/pretty_print_formatter.rb"
21
- require_relative "formatter/string_formatter.rb"
22
- require_relative "formatter/strip_formatter.rb"
23
- require_relative "formatter/structured_formatter.rb"
15
+ require_relative "formatter/date_time_formatter"
16
+ require_relative "formatter/exception_formatter"
17
+ require_relative "formatter/id_formatter"
18
+ require_relative "formatter/inspect_formatter"
19
+ require_relative "formatter/object_formatter"
20
+ require_relative "formatter/pretty_print_formatter"
21
+ require_relative "formatter/string_formatter"
22
+ require_relative "formatter/strip_formatter"
23
+ require_relative "formatter/structured_formatter"
24
24
 
25
25
  class << self
26
26
  # Returns a new empty formatter with no mapping. For historical reasons, a formatter
@@ -30,7 +30,7 @@ module Lumberjack
30
30
  new.clear
31
31
  end
32
32
  end
33
-
33
+
34
34
  def initialize
35
35
  @class_formatters = {}
36
36
  @module_formatters = {}
@@ -72,10 +72,10 @@ module Lumberjack
72
72
  remove(klass)
73
73
  else
74
74
  if formatter.is_a?(Symbol)
75
- formatter_class_name = "#{formatter.to_s.gsub(/(^|_)([a-z])/){|m| $~[2].upcase}}Formatter"
75
+ formatter_class_name = "#{formatter.to_s.gsub(/(^|_)([a-z])/) { |m| $~[2].upcase }}Formatter"
76
76
  formatter = Formatter.const_get(formatter_class_name).new
77
77
  end
78
-
78
+
79
79
  Array(klass).each do |k|
80
80
  if k.class == Module
81
81
  @module_formatters[k] = formatter
@@ -106,7 +106,7 @@ module Lumberjack
106
106
  end
107
107
  self
108
108
  end
109
-
109
+
110
110
  # Remove all formatters including the default formatter. Can be chained to add method calls.
111
111
  def clear
112
112
  @class_formatters.clear
@@ -117,7 +117,7 @@ module Lumberjack
117
117
  # Format a message object as a string.
118
118
  def format(message)
119
119
  formatter = formatter_for(message.class)
120
- if formatter && formatter.respond_to?(:call)
120
+ if formatter&.respond_to?(:call)
121
121
  formatter.call(message)
122
122
  else
123
123
  message
@@ -135,7 +135,7 @@ module Lumberjack
135
135
  # Find the formatter for a class by looking it up using the class hierarchy.
136
136
  def formatter_for(klass) #:nodoc:
137
137
  check_modules = true
138
- while klass != nil do
138
+ until klass.nil?
139
139
  formatter = @class_formatters[klass.name]
140
140
  return formatter if formatter
141
141
 
@@ -5,13 +5,12 @@ module Lumberjack
5
5
  # Format a Date, Time, or DateTime object. If you don't specify a format in the constructor,
6
6
  # it will use the ISO-8601 format.
7
7
  class DateTimeFormatter
8
-
9
8
  attr_reader :format
10
-
9
+
11
10
  def initialize(format = nil)
12
11
  @format = format.dup.to_s.freeze unless format.nil?
13
12
  end
14
-
13
+
15
14
  def call(obj)
16
15
  if @format && obj.respond_to?(:strftime)
17
16
  obj.strftime(@format)
@@ -7,7 +7,6 @@ module Lumberjack
7
7
  # passed to this object and the returned array is what will be logged. You can
8
8
  # use this to clean out superfluous lines.
9
9
  class ExceptionFormatter
10
-
11
10
  attr_accessor :backtrace_cleaner
12
11
 
13
12
  def initialize(backtrace_cleaner = nil)
@@ -33,7 +32,6 @@ module Lumberjack
33
32
  trace
34
33
  end
35
34
  end
36
-
37
35
  end
38
36
  end
39
37
  end
@@ -9,11 +9,11 @@ module Lumberjack
9
9
  def initialize(id_attribute = :id)
10
10
  @id_attribute = id_attribute
11
11
  end
12
-
12
+
13
13
  def call(obj)
14
14
  if obj.respond_to?(@id_attribute)
15
15
  id = obj.send(@id_attribute)
16
- { "class" => obj.class.name, "id" => id }
16
+ {"class" => obj.class.name, "id" => id}
17
17
  else
18
18
  obj.to_s
19
19
  end
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literals: true
2
2
 
3
- require 'pp'
4
- require 'stringio'
3
+ require "pp"
4
+ require "stringio"
5
5
 
6
6
  module Lumberjack
7
7
  class Formatter
8
8
  # Format an object with it's pretty print method.
9
9
  class PrettyPrintFormatter
10
10
  attr_accessor :width
11
-
11
+
12
12
  # Create a new formatter. The maximum width of the message can be specified with the width
13
13
  # parameter (defaults to 79 characters).
14
14
  def initialize(width = 79)
15
15
  @width = width
16
16
  end
17
-
17
+
18
18
  def call(obj)
19
19
  s = StringIO.new
20
20
  PP.pp(obj, s)
@@ -17,10 +17,10 @@ module Lumberjack
17
17
  @progname = progname
18
18
  @pid = pid
19
19
  # backward compatibility with 1.0 API where the last argument was the unit of work id
20
- if tags.nil? || tags.is_a?(Hash)
21
- @tags = tags
20
+ @tags = if tags.nil? || tags.is_a?(Hash)
21
+ tags
22
22
  else
23
- @tags = { UNIT_OF_WORK_ID => tags }
23
+ {UNIT_OF_WORK_ID => tags}
24
24
  end
25
25
  end
26
26
 
@@ -29,7 +29,7 @@ module Lumberjack
29
29
  end
30
30
 
31
31
  def to_s
32
- "[#{time.strftime(TIME_FORMAT)}.#{(time.usec / 1000.0).round.to_s.rjust(3, '0')} #{severity_label} #{progname}(#{pid})#{tags_to_s}] #{message}"
32
+ "[#{time.strftime(TIME_FORMAT)}.#{(time.usec / 1000.0).round.to_s.rjust(3, "0")} #{severity_label} #{progname}(#{pid})#{tags_to_s}] #{message}"
33
33
  end
34
34
 
35
35
  def inspect
@@ -46,10 +46,10 @@ module Lumberjack
46
46
  if tags
47
47
  tags[UNIT_OF_WORK_ID] = value
48
48
  else
49
- @tags = { UNIT_OF_WORK_ID => value }
49
+ @tags = {UNIT_OF_WORK_ID => value}
50
50
  end
51
51
  end
52
-
52
+
53
53
  # Return the tag with the specified name.
54
54
  def tag(name)
55
55
  tags[name.to_s] if tags
@@ -58,10 +58,8 @@ module Lumberjack
58
58
  private
59
59
 
60
60
  def tags_to_s
61
- tags_string = String.new
62
- if tags
63
- tags.each { |name, value| tags_string << " #{name}:#{value.inspect}" }
64
- end
61
+ tags_string = ""
62
+ tags&.each { |name, value| tags_string << " #{name}:#{value.inspect}" }
65
63
  tags_string
66
64
  end
67
65
  end
@@ -63,7 +63,7 @@ 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
- def initialize(device = STDOUT, options = {})
66
+ def initialize(device = $stdout, options = {})
67
67
  options = options.dup
68
68
  self.level = options.delete(:level) || INFO
69
69
  self.progname = options.delete(:progname)
@@ -100,19 +100,19 @@ module Lumberjack
100
100
  thread_local_value(:lumberjack_logger_level) || @level
101
101
  end
102
102
 
103
- alias_method :sev_threshold, :level
103
+ alias sev_threshold level
104
104
 
105
105
  # Set the log level using either an integer level like Logger::INFO or a label like
106
106
  # :info or "info"
107
107
  def level=(value)
108
- if value.is_a?(Integer)
109
- @level = value
108
+ @level = if value.is_a?(Integer)
109
+ value
110
110
  else
111
- @level = Severity::label_to_level(value)
111
+ Severity.label_to_level(value)
112
112
  end
113
113
  end
114
114
 
115
- alias_method :sev_threshold=, :level=
115
+ alias sev_threshold= level=
116
116
 
117
117
  # Set the Lumberjack::Formatter used to format objects for logging as messages.
118
118
  def formatter=(value)
@@ -137,7 +137,7 @@ module Lumberjack
137
137
  # in an array under the "tagged" tag. So calling `logger.tagged("foo", "bar")` will result
138
138
  # in tags `{"tagged" => ["foo", "bar"]}`.
139
139
  def tagged_logger!
140
- self.extend(TaggedLoggerSupport)
140
+ extend(TaggedLoggerSupport)
141
141
  self
142
142
  end
143
143
 
@@ -173,10 +173,10 @@ module Lumberjack
173
173
  if current_tags.empty?
174
174
  tags = Tags.stringify_keys(tags) unless tags.nil?
175
175
  else
176
- if tags.nil?
177
- tags = current_tags.dup
176
+ tags = if tags.nil?
177
+ current_tags.dup
178
178
  else
179
- tags = current_tags.merge(Tags.stringify_keys(tags))
179
+ current_tags.merge(Tags.stringify_keys(tags))
180
180
  end
181
181
  end
182
182
  tags = Tags.expand_runtime_values(tags)
@@ -203,7 +203,7 @@ module Lumberjack
203
203
  add_entry(severity, message, progname)
204
204
  end
205
205
 
206
- alias_method :log, :add
206
+ alias log add
207
207
 
208
208
  # Flush the logging device. Messages are not guaranteed to be written until this method is called.
209
209
  def flush
@@ -325,7 +325,7 @@ module Lumberjack
325
325
  def silence(temporary_level = ERROR, &block)
326
326
  if silencer
327
327
  unless temporary_level.is_a?(Integer)
328
- temporary_level = Severity::label_to_level(temporary_level)
328
+ temporary_level = Severity.label_to_level(temporary_level)
329
329
  end
330
330
  push_thread_local_value(:lumberjack_logger_level, temporary_level, &block)
331
331
  else
@@ -361,10 +361,11 @@ module Lumberjack
361
361
  push_thread_local_value(:lumberjack_logger_tags, merged_tags, &block)
362
362
  elsif thread_tags
363
363
  thread_tags.merge!(tags)
364
+ nil
364
365
  else
365
366
  @tags.merge!(tags)
367
+ nil
366
368
  end
367
- nil
368
369
  end
369
370
 
370
371
  # Remove a tag from the current tag context. If this is called inside a block to a
@@ -380,17 +381,35 @@ module Lumberjack
380
381
  end
381
382
 
382
383
  # Return all tags in scope on the logger including global tags set on the Lumberjack
383
- # context, tags set on the logger, and tags set on the current block for the logger
384
+ # context, tags set on the logger, and tags set on the current block for the logger.
384
385
  def tags
385
386
  tags = {}
386
387
  context_tags = Lumberjack.context_tags
387
388
  tags.merge!(context_tags) if context_tags && !context_tags.empty?
388
- tags.merge!(@tags) if !@tags.empty?
389
+ tags.merge!(@tags) if !@tags.empty? && !thread_local_value(:lumberjack_logger_untagged)
389
390
  scope_tags = thread_local_value(:lumberjack_logger_tags)
390
391
  tags.merge!(scope_tags) if scope_tags && !scope_tags.empty?
391
392
  tags
392
393
  end
393
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
+
394
413
  private
395
414
 
396
415
  # Dereference arguments to log calls so we can have methods with compatibility with ::Logger
@@ -473,12 +492,12 @@ module Lumberjack
473
492
  end
474
493
 
475
494
  def write_to_device(entry) #:nodoc:
476
- begin
477
- device.write(entry)
478
- rescue => e
479
- $stderr.puts("#{e.class.name}: #{e.message}#{' at ' + e.backtrace.first if e.backtrace}")
480
- $stderr.puts(entry.to_s)
481
- end
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
482
501
  end
483
502
 
484
503
  # Create a thread that will periodically call flush.
@@ -487,12 +506,12 @@ module Lumberjack
487
506
  begin
488
507
  logger = self
489
508
  Thread.new do
490
- while !closed?
509
+ until closed?
491
510
  begin
492
511
  sleep(flush_seconds)
493
512
  logger.flush if Time.now - logger.last_flushed_at >= flush_seconds
494
513
  rescue => e
495
- $stderr.puts("Error flushing log: #{e.inspect}")
514
+ warn("Error flushing log: #{e.inspect}")
496
515
  end
497
516
  end
498
517
  end
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Lumberjack
4
4
  module Rack
5
- require_relative "rack/unit_of_work.rb"
6
- require_relative "rack/request_id.rb"
7
- require_relative "rack/context.rb"
5
+ require_relative "rack/unit_of_work"
6
+ require_relative "rack/request_id"
7
+ require_relative "rack/context"
8
8
  end
9
9
  end
@@ -16,7 +16,7 @@ module Lumberjack
16
16
  def call(env)
17
17
  request_id = env[REQUEST_ID]
18
18
  if request_id && @abbreviated
19
- request_id = request_id.split('-', 2).first
19
+ request_id = request_id.split("-", 2).first
20
20
  end
21
21
  Lumberjack.unit_of_work(request_id) do
22
22
  @app.call(env)
@@ -6,7 +6,7 @@ module Lumberjack
6
6
  def initialize(app)
7
7
  @app = app
8
8
  end
9
-
9
+
10
10
  def call(env)
11
11
  Lumberjack.unit_of_work do
12
12
  @app.call(env)
@@ -11,7 +11,7 @@ module Lumberjack
11
11
  FATAL = ::Logger::Severity::FATAL
12
12
  UNKNOWN = ::Logger::Severity::UNKNOWN
13
13
 
14
- SEVERITY_LABELS = %w(DEBUG INFO WARN ERROR FATAL UNKNOWN).freeze
14
+ SEVERITY_LABELS = %w[DEBUG INFO WARN ERROR FATAL UNKNOWN].freeze
15
15
 
16
16
  class << self
17
17
  def level_to_label(severity)
@@ -22,6 +22,5 @@ module Lumberjack
22
22
  SEVERITY_LABELS.index(label.to_s.upcase) || UNKNOWN
23
23
  end
24
24
  end
25
-
26
25
  end
27
26
  end
@@ -9,7 +9,6 @@ module Lumberjack
9
9
  # tag_formatter.add(["password", "email"]) { |value| "***" }
10
10
  # tag_formatter.add("finished_at", Lumberjack::Formatter::DateTimeFormatter.new("%Y-%m-%dT%H:%m:%S%z"))
11
11
  class TagFormatter
12
-
13
12
  def initialize
14
13
  @formatters = {}
15
14
  @default_formatter = nil
@@ -87,12 +86,11 @@ module Lumberjack
87
86
  if formatter.is_a?(TaggedLoggerSupport::Formatter)
88
87
  formatter.__formatter
89
88
  elsif formatter.is_a?(Symbol)
90
- formatter_class_name = "#{formatter.to_s.gsub(/(^|_)([a-z])/){|m| $~[2].upcase}}Formatter"
89
+ formatter_class_name = "#{formatter.to_s.gsub(/(^|_)([a-z])/) { |m| $~[2].upcase }}Formatter"
91
90
  Formatter.const_get(formatter_class_name).new
92
91
  else
93
92
  formatter
94
93
  end
95
94
  end
96
-
97
95
  end
98
96
  end
@@ -6,7 +6,6 @@ require "forwardable"
6
6
  module Lumberjack
7
7
  # Methods to make Lumberjack::Logger API compatible with ActiveSupport::TaggedLogger.
8
8
  module TaggedLoggerSupport
9
-
10
9
  class Formatter < DelegateClass(Lumberjack::Formatter)
11
10
  extend Forwardable
12
11
  def_delegators :@logger, :tagged, :push_tags, :pop_tags, :clear_tags!
@@ -10,7 +10,7 @@ module Lumberjack
10
10
  base.singleton_class.send(:prepend, ClassMethods)
11
11
  end
12
12
  end
13
-
13
+
14
14
  module ClassMethods
15
15
  def new(logger)
16
16
  if logger.is_a?(Lumberjack::Logger)
@@ -27,7 +27,7 @@ module Lumberjack
27
27
  if hash.all? { |key, value| key.is_a?(String) && !value.is_a?(Proc) }
28
28
  return hash
29
29
  end
30
-
30
+
31
31
  copy = {}
32
32
  hash.each do |key, value|
33
33
  if value.is_a?(Proc) && (value.arity == 0 || value.arity == -1)
@@ -14,7 +14,7 @@ module Lumberjack
14
14
  # If your tag name contains characters other than alpha numerics and the underscore, you must surround it
15
15
  # with curly brackets: `:{http.request-id}`.
16
16
  class Template
17
- TEMPLATE_ARGUMENT_ORDER = %w(:time :severity :progname :pid :message :tags).freeze
17
+ TEMPLATE_ARGUMENT_ORDER = %w[:time :severity :progname :pid :message :tags].freeze
18
18
  MILLISECOND_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%3N"
19
19
  MICROSECOND_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%6N"
20
20
  PLACEHOLDER_PATTERN = /:(([a-z0-9_]+)|({[^}]+}))/i.freeze
@@ -86,7 +86,7 @@ module Lumberjack
86
86
  def tag_args(tags, tag_vars)
87
87
  return [nil] * (tag_vars.size + 1) if tags.nil? || tags.size == 0
88
88
 
89
- tags_string = String.new
89
+ tags_string = ""
90
90
  tags.each do |name, value|
91
91
  unless value.nil? || tag_vars.include?(name)
92
92
  value = value.to_s
@@ -1,8 +1,8 @@
1
1
  Gem::Specification.new do |spec|
2
- spec.name = 'lumberjack'
3
- spec.version = File.read(File.expand_path("../VERSION", __FILE__)).strip
4
- spec.authors = ['Brian Durand']
5
- spec.email = ['bbdurand@gmail.com']
2
+ spec.name = "lumberjack"
3
+ spec.version = File.read(File.join(__dir__, "VERSION")).strip
4
+ spec.authors = ["Brian Durand"]
5
+ spec.email = ["bbdurand@gmail.com"]
6
6
 
7
7
  spec.summary = "A simple, powerful, and very fast logging utility that can be a drop in replacement for Logger or ActiveSupport::BufferedLogger."
8
8
  spec.homepage = "https://github.com/bdurand/lumberjack"
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  # Specify which files should be added to the gem when it is released.
12
12
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
13
- ignore_files = %w(
13
+ ignore_files = %w[
14
14
  .
15
15
  Appraisals
16
16
  Gemfile
@@ -18,17 +18,14 @@ Gem::Specification.new do |spec|
18
18
  Rakefile
19
19
  gemfiles/
20
20
  spec/
21
- )
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
- `git ls-files -z`.split("\x0").reject{ |f| ignore_files.any?{ |path| f.start_with?(path) } }
21
+ ]
22
+ spec.files = Dir.chdir(__dir__) do
23
+ `git ls-files -z`.split("\x0").reject { |f| ignore_files.any? { |path| f.start_with?(path) } }
24
24
  end
25
25
 
26
- spec.require_paths = ['lib']
26
+ spec.require_paths = ["lib"]
27
27
 
28
- spec.required_ruby_version = '>= 2.3.0'
28
+ spec.required_ruby_version = ">= 2.3.0"
29
29
 
30
- spec.add_development_dependency("rspec", ["~> 3.0"])
31
- spec.add_development_dependency("timecop")
32
- spec.add_development_dependency "rake"
33
- spec.add_development_dependency "appraisal"
30
+ spec.add_development_dependency "bundler"
34
31
  end
metadata CHANGED
@@ -1,59 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lumberjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Durand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-30 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: timecop
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: appraisal
14
+ name: bundler
57
15
  requirement: !ruby/object:Gem::Requirement
58
16
  requirements:
59
17
  - - ">="