contextual_logger 0.7.0 → 0.10.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c5f9b5da78d5d1060c6d87bdc5cb6639db258e95
4
- data.tar.gz: fe4ada234a541e0bc1dab059f1fbb997cd7f1e2b
2
+ SHA256:
3
+ metadata.gz: 802c31d7f8703a4105e7ff1b0cd53b2a692cc92d3a6a9d2760f6cd34e6445f93
4
+ data.tar.gz: 847378acf2d1b5b9bdb2340a0d7e5712466eae68604c292e5138669333357fe5
5
5
  SHA512:
6
- metadata.gz: 352099a97b6f90546e796843a5ef3248299f393e78756824066928b9192c70b8df37c63e91765460daba540c00a910d92e58fa095bf681330583810ed3398464
7
- data.tar.gz: 47b668cebdd5829fc2e1c524dc2aa081eda73d16016e8d48a5a36be235af36b6a068bb0d489294dd830478d83bf8cd618b3de6128e5626c3a6c5d71e50088d31
6
+ metadata.gz: e8ee88e23ea62d3a1a69d2b3ed194a5b85533a4abf6fd3c4ad228ba99e49abff064dfff7731135f77389f2b8b9ff99722b0485f2c74f1ab97986151f9de2a861
7
+ data.tar.gz: af21224421af963cd2134114b136764eacfff5a76842feeb125f3e20aaf8c477f0869f4bc55613d3d94d39e17f54353078cb357fed813700d4d88dc6fc3ff207
@@ -1,11 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support'
4
+ require 'active_support/core_ext/module/delegation'
4
5
  require 'json'
5
6
  require_relative './contextual_logger/redactor'
6
7
  require_relative './contextual_logger/context/handler'
7
8
 
8
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
+
9
20
  class << self
10
21
  def new(logger)
11
22
  logger.extend(LoggerMixin)
@@ -16,22 +27,8 @@ module ContextualLogger
16
27
  if log_level.is_a?(Integer) && (Logger::Severity::DEBUG..Logger::Severity::UNKNOWN).include?(log_level)
17
28
  log_level
18
29
  else
19
- case log_level.to_s.downcase
20
- when 'debug'
21
- Logger::Severity::DEBUG
22
- when 'info'
23
- Logger::Severity::INFO
24
- when 'warn'
25
- Logger::Severity::WARN
26
- when 'error'
27
- Logger::Severity::ERROR
28
- when 'fatal'
29
- Logger::Severity::FATAL
30
- when 'unknown'
31
- Logger::Severity::UNKNOWN
32
- else
30
+ LOG_LEVEL_NAMES_TO_SEVERITY[log_level.to_s.downcase.to_sym] or
33
31
  raise ArgumentError, "invalid log level: #{log_level.inspect}"
34
- end
35
32
  end
36
33
  end
37
34
 
@@ -71,45 +68,54 @@ module ContextualLogger
71
68
  Context::Handler.current_context
72
69
  end
73
70
 
74
- def debug(message = nil, context = {})
75
- add(Logger::Severity::DEBUG, message.nil? && block_given? ? yield : message, **context)
76
- end
77
-
78
- def info(message = nil, context = {})
79
- add(Logger::Severity::INFO, message.nil? && block_given? ? yield : message, **context)
80
- end
81
-
82
- def warn(message = nil, context = {})
83
- add(Logger::Severity::WARN, message.nil? && block_given? ? yield : message, **context)
84
- end
85
-
86
- def error(message = nil, context = {})
87
- add(Logger::Severity::ERROR, message.nil? && block_given? ? yield : message, **context)
88
- 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.
89
76
 
90
- def fatal(message = nil, context = {})
91
- add(Logger::Severity::FATAL, message.nil? && block_given? ? yield : message, **context)
92
- 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.
93
80
 
94
- def unknown(message = nil, context = {})
95
- 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) do
91
+ "\#{ContextualLogger.normalize_message(arg)}: \#{ContextualLogger.normalize_message(block.call)}"
92
+ end
93
+ else
94
+ add(#{log_level}, arg, context)
95
+ end
96
+ end
97
+ end
98
+ EOS
96
99
  end
97
100
 
98
101
  def log_level_enabled?(severity)
99
102
  severity >= level
100
103
  end
101
104
 
102
- def add(init_severity, message = nil, init_progname = nil, **context) # Ruby will prefer to match hashes up to last ** argument
103
- severity = init_severity || UNKNOWN
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
104
107
  if log_level_enabled?(severity)
105
- progname = init_progname || @progname
106
- if message.nil?
108
+ if arg1.nil?
107
109
  if block_given?
108
110
  message = yield
111
+ progname = arg2 || @progname
109
112
  else
110
- message = init_progname
113
+ message = arg2
111
114
  progname = @progname
112
115
  end
116
+ else
117
+ message = arg1
118
+ progname = arg2 || @progname
113
119
  end
114
120
  write_entry_to_log(severity, Time.now, progname, message, context: current_context_for_thread.deep_merge(context))
115
121
  end
@@ -132,25 +138,23 @@ module ContextualLogger
132
138
  end
133
139
 
134
140
  def format_message(severity, timestamp, progname, message, context: {})
135
- message_hash = message_hash_with_context(severity, timestamp, progname, message, context: context)
136
-
137
141
  if @formatter
138
- @formatter.call(severity, timestamp, progname, message_hash)
142
+ @formatter.call(severity, timestamp, progname, { message: ContextualLogger.normalize_message(message) }.merge!(context))
139
143
  else
140
- "#{message_hash.to_json}\n"
144
+ "#{basic_json_log_entry(severity, timestamp, progname, message, context: context)}\n"
141
145
  end
142
146
  end
143
147
 
144
- def message_hash_with_context(severity, timestamp, progname, message, context:)
145
- message_hash =
146
- {
147
- message: ContextualLogger.normalize_message(message),
148
- severity: severity,
149
- timestamp: timestamp
150
- }
148
+ def basic_json_log_entry(severity, timestamp, progname, message, context:)
149
+ message_hash = {
150
+ message: ContextualLogger.normalize_message(message),
151
+ severity: severity,
152
+ timestamp: timestamp
153
+ }
151
154
  message_hash[:progname] = progname if progname
152
155
 
153
- message_hash.merge!(context)
156
+ # using merge! instead of merge for speed of operation
157
+ message_hash.merge!(context).to_json
154
158
  end
155
159
  end
156
160
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ContextualLogger
4
- VERSION = '0.7.0'
4
+ VERSION = '0.10.0.pre.1'
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.7.0
4
+ version: 0.10.0.pre.1
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-14 00:00:00.000000000 Z
11
+ date: 2020-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -67,12 +67,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
67
67
  version: '0'
68
68
  required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  requirements:
70
- - - ">="
70
+ - - ">"
71
71
  - !ruby/object:Gem::Version
72
- version: '0'
72
+ version: 1.3.1
73
73
  requirements: []
74
- rubyforge_project:
75
- rubygems_version: 2.6.13
74
+ rubygems_version: 3.0.3
76
75
  signing_key:
77
76
  specification_version: 4
78
77
  summary: Add context to your logger