contextual_logger 0.3.1 → 0.4.pre.1

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
  SHA1:
3
- metadata.gz: 2005c27e3db3c69146eeae90c5dd89f75f8ad56c
4
- data.tar.gz: b7cb42a1aee422df6e2135d35d67c81202f944b3
3
+ metadata.gz: 6fd7d8ae966a768ad95020d9dacf6c60a6abc938
4
+ data.tar.gz: 5251c5e24e99820875dbf83b01dc7ae9390c9ed8
5
5
  SHA512:
6
- metadata.gz: 877c0ab113f3d220c87670739c7fb1a0a242f5ebd73c54fcc2eb12227747a47d041c222394a1c2485ce22e8d40255362a9956922cd3b0a8328ca4eead73f2c3e
7
- data.tar.gz: 3c201cbe9719e9f19c31e7f3f8c3960ba37eb8099df2e808a7704b27a728ca9d2640173bd02afc8165a4cc53ef9a72bda3d5fc3cc3b89ac5933f4680f6c072fd
6
+ metadata.gz: a0d4e12220c89308677cd1195ec942780d57f11ddab574f11f4fe6a5a6615852cc8f5973f17b99b1fcba9f2c25c953f1bb3492220903b7f5d729f66851d344e9
7
+ data.tar.gz: baca8317383cf92cc6d9572287877ec42989638af1774465d506e63062125593e7a3dc610779ac564b4175a9ff6e866fc5ca592b2fd94b8ea5d244c737ae1624
@@ -5,94 +5,97 @@ require 'json'
5
5
  require_relative './contextual_logger/context/handler'
6
6
 
7
7
  module ContextualLogger
8
- def self.new(logger)
9
- logger.extend(self)
8
+ class << self
9
+ def new(logger)
10
+ logger.extend(LoggerMixin)
11
+ end
10
12
  end
11
13
 
12
- def global_context=(context)
13
- ContextualLogger::Context::Handler.new(context).set!
14
- end
14
+ module LoggerMixin
15
+ def global_context=(context)
16
+ Context::Handler.new(context).set!
17
+ end
15
18
 
16
- def with_context(context)
17
- context_handler = ContextualLogger::Context::Handler.new(current_context_for_thread.deep_merge(context))
18
- context_handler.set!
19
- if block_given?
20
- yield
21
- else
22
- context_handler
19
+ def with_context(context)
20
+ context_handler = Context::Handler.new(current_context_for_thread.deep_merge(context))
21
+ context_handler.set!
22
+ if block_given?
23
+ begin
24
+ yield
25
+ ensure
26
+ context_handler.reset!
27
+ end
28
+ else
29
+ # If no block given, the context handler is returned to the caller so they can handle reset! themselves.
30
+ context_handler
31
+ end
23
32
  end
24
- ensure
25
- context_handler.reset! if block_given?
26
- end
27
33
 
28
- def current_context_for_thread
29
- ContextualLogger::Context::Handler.current_context
30
- end
34
+ def current_context_for_thread
35
+ Context::Handler.current_context
36
+ end
31
37
 
32
- def format_message(severity, timestamp, progname, message, context)
33
- message_with_context = message_with_context(context, message, severity, timestamp, progname)
38
+ def debug(message = nil, context = {})
39
+ add_if_enabled(Logger::Severity::DEBUG, message || yield, context: context)
40
+ end
34
41
 
35
- if @formatter
36
- @formatter.call(severity, timestamp, progname, message_with_context)
37
- else
38
- "#{message_with_context.to_json}\n"
42
+ def info(message = nil, context = {})
43
+ add_if_enabled(Logger::Severity::INFO, message || yield, context: context)
39
44
  end
40
- end
41
45
 
42
- def debug(progname = nil, **extra_context, &block)
43
- add(Logger::Severity::DEBUG, nil, progname, extra_context, &block)
44
- end
46
+ def warn(message = nil, context = {})
47
+ add_if_enabled(Logger::Severity::WARN, message || yield, context: context)
48
+ end
45
49
 
46
- def info(progname = nil, **extra_context, &block)
47
- add(Logger::Severity::INFO, nil, progname, extra_context, &block)
48
- end
50
+ def error(message = nil, context = {})
51
+ add_if_enabled(Logger::Severity::ERROR, message || yield, context: context)
52
+ end
49
53
 
50
- def warn(progname = nil, **extra_context, &block)
51
- add(Logger::Severity::WARN, nil, progname, extra_context, &block)
52
- end
54
+ def fatal(message = nil, context = {})
55
+ add_if_enabled(Logger::Severity::FATAL, message || yield, context: context)
56
+ end
53
57
 
54
- def error(progname = nil, **extra_context, &block)
55
- add(Logger::Severity::ERROR, nil, progname, extra_context, &block)
56
- end
58
+ def unknown(message = nil, context = {})
59
+ add_if_enabled(Logger::Severity::UNKNOWN, message || yield, context: context)
60
+ end
57
61
 
58
- def fatal(progname = nil, **extra_context, &block)
59
- add(Logger::Severity::FATAL, nil, progname, extra_context, &block)
60
- end
62
+ def log_level_enabled?(severity)
63
+ severity >= level
64
+ end
61
65
 
62
- def unknown(progname = nil, **extra_context, &block)
63
- add(Logger::Severity::UNKNOWN, nil, progname, extra_context, &block)
64
- end
66
+ def add_if_enabled(severity, message, context:)
67
+ if log_level_enabled?(severity)
68
+ write_entry_to_log(severity, Time.now, @progname, message, context: current_context_for_thread.deep_merge(context))
69
+ end
70
+ true
71
+ end
65
72
 
66
- def add(severity, message = nil, progname = nil, extra_context = nil)
67
- severity ||= UNKNOWN
68
- if @logdev.nil? || (severity < @level)
69
- return true
73
+ def write_entry_to_log(severity, timestamp, progname, message, context:)
74
+ @logdev&.write(format_message(format_severity(severity), timestamp, progname, message, context: context))
70
75
  end
71
- progname ||= @progname
72
- if message.nil?
73
- if block_given?
74
- message = yield
76
+
77
+ private
78
+
79
+ def format_message(severity, timestamp, progname, message, context: {})
80
+ message_hash = message_hash_with_context(severity, timestamp, progname, message, context: context)
81
+
82
+ if @formatter
83
+ @formatter.call(severity, timestamp, progname, message_hash)
75
84
  else
76
- message = progname
77
- progname = @progname
85
+ "#{message_hash.to_json}\n"
78
86
  end
79
87
  end
80
- write_entry_to_log(severity, Time.now, progname, message, current_context_for_thread.deep_merge(extra_context || {}))
81
- true
82
- end
83
-
84
- def write_entry_to_log(severity, timestamp, progname, message, context)
85
- @logdev.write(format_message(format_severity(severity), timestamp, progname, message, context))
86
- end
87
88
 
88
- private
89
+ def message_hash_with_context(severity, timestamp, progname, message, context:)
90
+ message_hash =
91
+ {
92
+ message: message,
93
+ severity: severity,
94
+ timestamp: timestamp
95
+ }
96
+ message_hash[:progname] = progname if progname
89
97
 
90
- def message_with_context(context, message, severity, timestamp, progname)
91
- context.merge(
92
- message: message,
93
- severity: severity,
94
- timestamp: timestamp,
95
- progname: progname
96
- )
98
+ message_hash.merge!(context)
99
+ end
97
100
  end
98
101
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ContextualLogger
4
+ # A logger that deep_merges additional context and then delegates to the given logger.
5
+ # Keeps it own log level (called override_level) that may be set independently of the logger it delegates to.
6
+ # If override_level is non-nil, it takes precedence; if it is nil (the default), then it delegates to the logger.
7
+ class LoggerWithContext
8
+ include LoggerMixin
9
+
10
+ attr_reader :logger, :override_level, :context
11
+
12
+ def initialize(logger, context, level: nil)
13
+ logger.is_a?(LoggerMixin) or raise ArgumentError, "logger must include ContextualLogger::LoggerMixin (got #{logger.inspect})"
14
+ @logger = logger
15
+ @override_level = level
16
+ @context = context
17
+ @merged_context_cache = {} # so we don't have to merge every time
18
+ end
19
+
20
+ def level
21
+ @override_level || @logger.level
22
+ end
23
+
24
+ def level=(override_level)
25
+ @override_level = override_level
26
+ end
27
+
28
+ def write_entry_to_log(severity, timestamp, progname, message, context:)
29
+ merged_context =
30
+ if @merged_context_cache.size >= 1000 # keep this cache memory use finite
31
+ @merged_context_cache[context] || @context.deep_merge(context)
32
+ else
33
+ @merged_context_cache[context] ||= @context.deep_merge(context)
34
+ end
35
+
36
+ @logger.write_entry_to_log(severity, timestamp, progname, message, context: merged_context)
37
+ end
38
+
39
+ class << self
40
+ def for_log_source(logger, log_source, level: nil)
41
+ new(logger, { log_source: log_source }, level: level)
42
+ end
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contextual_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Ebentier
@@ -46,12 +46,14 @@ extra_rdoc_files: []
46
46
  files:
47
47
  - lib/contextual_logger.rb
48
48
  - lib/contextual_logger/context/handler.rb
49
+ - lib/contextual_logger/logger_with_context.rb
49
50
  - lib/contextual_logger/overrides/active_support/tagged_logging/formatter.rb
50
51
  homepage: https://rubygems.org/gems/contextual_logger
51
52
  licenses:
52
53
  - MIT
53
54
  metadata:
54
- source_code_uri: https://github.com/Invoca/contextual_logger
55
+ source_code_uri: https://github.com/Invoca/process_settings
56
+ allowed_push_host: https://rubygems.org
55
57
  post_install_message:
56
58
  rdoc_options: []
57
59
  require_paths:
@@ -63,9 +65,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
65
  version: '0'
64
66
  required_rubygems_version: !ruby/object:Gem::Requirement
65
67
  requirements:
66
- - - ">="
68
+ - - ">"
67
69
  - !ruby/object:Gem::Version
68
- version: '0'
70
+ version: 1.3.1
69
71
  requirements: []
70
72
  rubyforge_project:
71
73
  rubygems_version: 2.6.13