contextual_logger 0.8.0 → 0.10.0

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: 18dbe015c1afe16cedfab41724a5efd02b0f26e12de9b19d9f55a206a2e8513a
4
- data.tar.gz: 672605e6ae20d620435d0d9f6d47f9a2a39c7384b0fcf352618a0c9b0d59c4e0
3
+ metadata.gz: 2fe842aebc69d35423b8b06cb1c3dc270fc64d5541293c946dc8eb4f6bc274ed
4
+ data.tar.gz: b3591004af708bd8722c313c222bf85dc4452053d2d2deb7c8abda72a500391e
5
5
  SHA512:
6
- metadata.gz: 6b57e454af45bbf44d64e96fb6e34c0a8ad2e30ba590413177bcdd87206e75d7e2c65e3974133eb87142a157645cadd870369c290f4f65da1275838bcc521100
7
- data.tar.gz: 36e078b7bc8fce929a524122448312e3a6856167cc5676dc4465a4c20d22fdd55eae7bf92e3531614b2a602370ff7ecdb79f9c9dd146620e5da4fed80f0cd738
6
+ metadata.gz: f79aa7e16d8b788b8b641fd8d62109f67c4e566ee4bb90a816fd9cf894729bc74354bcb01935ff6f15a3ed330bb0ea56629d9ad7cc24ef4d3cbe68fe8203270c
7
+ data.tar.gz: ec0406c0265718ee617a55f209e004805df6ce516d36a080680dda648e59ffd61ae48ebd654f1ced16db34c4bfcd83584002757b1abb8ce8fb6104582dca0307
@@ -7,6 +7,16 @@ require_relative './contextual_logger/redactor'
7
7
  require_relative './contextual_logger/context/handler'
8
8
 
9
9
  module ContextualLogger
10
+ LOG_LEVEL_NAMES_TO_SEVERITY =
11
+ {
12
+ debug: Logger::Severity::DEBUG,
13
+ info: Logger::Severity::INFO,
14
+ warn: Logger::Severity::WARN,
15
+ error: Logger::Severity::ERROR,
16
+ fatal: Logger::Severity::FATAL,
17
+ unknown: Logger::Severity::UNKNOWN
18
+ }.freeze
19
+
10
20
  class << self
11
21
  def new(logger)
12
22
  logger.extend(LoggerMixin)
@@ -17,22 +27,8 @@ module ContextualLogger
17
27
  if log_level.is_a?(Integer) && (Logger::Severity::DEBUG..Logger::Severity::UNKNOWN).include?(log_level)
18
28
  log_level
19
29
  else
20
- case log_level.to_s.downcase
21
- when 'debug'
22
- Logger::Severity::DEBUG
23
- when 'info'
24
- Logger::Severity::INFO
25
- when 'warn'
26
- Logger::Severity::WARN
27
- when 'error'
28
- Logger::Severity::ERROR
29
- when 'fatal'
30
- Logger::Severity::FATAL
31
- when 'unknown'
32
- Logger::Severity::UNKNOWN
33
- else
30
+ LOG_LEVEL_NAMES_TO_SEVERITY[log_level.to_s.downcase.to_sym] or
34
31
  raise ArgumentError, "invalid log level: #{log_level.inspect}"
35
- end
36
32
  end
37
33
  end
38
34
 
@@ -72,45 +68,54 @@ module ContextualLogger
72
68
  Context::Handler.current_context
73
69
  end
74
70
 
75
- def debug(message = nil, context = {})
76
- add(Logger::Severity::DEBUG, message.nil? && block_given? ? yield : message, **context)
77
- end
78
-
79
- def info(message = nil, context = {})
80
- add(Logger::Severity::INFO, message.nil? && block_given? ? yield : message, **context)
81
- end
82
-
83
- def warn(message = nil, context = {})
84
- add(Logger::Severity::WARN, message.nil? && block_given? ? yield : message, **context)
85
- end
86
-
87
- def error(message = nil, context = {})
88
- add(Logger::Severity::ERROR, message.nil? && block_given? ? yield : message, **context)
89
- end
71
+ # In the methods generated below, we assume that presence of context means new code that is
72
+ # aware of ContextualLogger...and that that code never uses progname.
73
+ # This is important because we only get 3 args total (not including &block) passed to `add`,
74
+ # in order to be compatible with classic implementations like in the plain ::Logger and
75
+ # ActiveSupport::Logger.broadcast.
90
76
 
91
- def fatal(message = nil, context = {})
92
- add(Logger::Severity::FATAL, message.nil? && block_given? ? yield : message, **context)
93
- end
77
+ # Note that we can't yield before `add` because `add` might skip it based on log_level. And we can't check
78
+ # log_level here because we might be running in ActiveSupport::Logging.broadcast which has multiple
79
+ # loggers, each with their own log_level.
94
80
 
95
- def unknown(message = nil, context = {})
96
- add(Logger::Severity::UNKNOWN, message.nil? && block_given? ? yield : message, **context)
81
+ LOG_LEVEL_NAMES_TO_SEVERITY.each do |method_name, log_level|
82
+ class_eval(<<~EOS, __FILE__, __LINE__ + 1)
83
+ def #{method_name}(arg = nil, **context, &block)
84
+ if context.empty?
85
+ add(#{log_level}, nil, arg, &block)
86
+ else
87
+ if arg.nil?
88
+ add(#{log_level}, nil, context, &block)
89
+ elsif block
90
+ add(#{log_level}, nil, context.merge(progname: arg), &block)
91
+ else
92
+ add(#{log_level}, arg, context)
93
+ end
94
+ end
95
+ end
96
+ EOS
97
97
  end
98
98
 
99
99
  def log_level_enabled?(severity)
100
100
  severity >= level
101
101
  end
102
102
 
103
- def add(init_severity, message = nil, init_progname = nil, **context) # Ruby will prefer to match hashes up to last ** argument
104
- severity = init_severity || UNKNOWN
103
+ # Note that this interface needs to stay compatible with the underlying ::Logger#add interface,
104
+ # which is: def add(severity, message = nil, progname = nil)
105
+ def add(arg_severity, arg1 = nil, arg2 = nil, **context) # Ruby will prefer to match hashes up to last ** argument
106
+ severity = arg_severity || UNKNOWN
105
107
  if log_level_enabled?(severity)
106
- progname = init_progname || @progname
107
- if message.nil?
108
+ if arg1.nil?
108
109
  if block_given?
109
110
  message = yield
111
+ progname = arg2 || context.delete(:progname) || @progname
110
112
  else
111
- message = init_progname
113
+ message = arg2
112
114
  progname = @progname
113
115
  end
116
+ else
117
+ message = arg1
118
+ progname = arg2 || @progname
114
119
  end
115
120
  write_entry_to_log(severity, Time.now, progname, message, context: current_context_for_thread.deep_merge(context))
116
121
  end
@@ -133,25 +138,25 @@ module ContextualLogger
133
138
  end
134
139
 
135
140
  def format_message(severity, timestamp, progname, message, context: {})
136
- message_hash = message_hash_with_context(severity, timestamp, progname, message, context: context)
137
-
141
+ normalized_message = ContextualLogger.normalize_message(message)
142
+ normalized_progname = ContextualLogger.normalize_message(progname) unless progname.nil?
138
143
  if @formatter
139
- @formatter.call(severity, timestamp, progname, message_hash)
144
+ @formatter.call(severity, timestamp, normalized_progname, { message: normalized_message }.merge!(context))
140
145
  else
141
- "#{message_hash.to_json}\n"
146
+ "#{basic_json_log_entry(severity, timestamp, normalized_progname, normalized_message, context: context)}\n"
142
147
  end
143
148
  end
144
149
 
145
- def message_hash_with_context(severity, timestamp, progname, message, context:)
146
- message_hash =
147
- {
148
- message: ContextualLogger.normalize_message(message),
149
- severity: severity,
150
- timestamp: timestamp
151
- }
152
- message_hash[:progname] = progname if progname
150
+ def basic_json_log_entry(severity, timestamp, normalized_progname, normalized_message, context:)
151
+ message_hash = {
152
+ message: normalized_progname ? "#{normalized_progname}: #{normalized_message}" : normalized_message,
153
+ severity: severity,
154
+ timestamp: timestamp
155
+ }
156
+ message_hash[:progname] = normalized_progname if normalized_progname
153
157
 
154
- message_hash.merge!(context)
158
+ # merge! is faster and OK here since message_hash is still local only to this method
159
+ message_hash.merge!(context).to_json
155
160
  end
156
161
  end
157
162
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ContextualLogger
4
- VERSION = '0.8.0'
4
+ VERSION = '0.10.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contextual_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Ebentier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-15 00:00:00.000000000 Z
11
+ date: 2020-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json