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 +4 -4
- data/lib/contextual_logger.rb +71 -68
- data/lib/contextual_logger/logger_with_context.rb +45 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fd7d8ae966a768ad95020d9dacf6c60a6abc938
|
4
|
+
data.tar.gz: 5251c5e24e99820875dbf83b01dc7ae9390c9ed8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0d4e12220c89308677cd1195ec942780d57f11ddab574f11f4fe6a5a6615852cc8f5973f17b99b1fcba9f2c25c953f1bb3492220903b7f5d729f66851d344e9
|
7
|
+
data.tar.gz: baca8317383cf92cc6d9572287877ec42989638af1774465d506e63062125593e7a3dc610779ac564b4175a9ff6e866fc5ca592b2fd94b8ea5d244c737ae1624
|
data/lib/contextual_logger.rb
CHANGED
@@ -5,94 +5,97 @@ require 'json'
|
|
5
5
|
require_relative './contextual_logger/context/handler'
|
6
6
|
|
7
7
|
module ContextualLogger
|
8
|
-
|
9
|
-
logger
|
8
|
+
class << self
|
9
|
+
def new(logger)
|
10
|
+
logger.extend(LoggerMixin)
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
module LoggerMixin
|
15
|
+
def global_context=(context)
|
16
|
+
Context::Handler.new(context).set!
|
17
|
+
end
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
34
|
+
def current_context_for_thread
|
35
|
+
Context::Handler.current_context
|
36
|
+
end
|
31
37
|
|
32
|
-
|
33
|
-
|
38
|
+
def debug(message = nil, context = {})
|
39
|
+
add_if_enabled(Logger::Severity::DEBUG, message || yield, context: context)
|
40
|
+
end
|
34
41
|
|
35
|
-
|
36
|
-
|
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
|
-
|
43
|
-
|
44
|
-
|
46
|
+
def warn(message = nil, context = {})
|
47
|
+
add_if_enabled(Logger::Severity::WARN, message || yield, context: context)
|
48
|
+
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
def error(message = nil, context = {})
|
51
|
+
add_if_enabled(Logger::Severity::ERROR, message || yield, context: context)
|
52
|
+
end
|
49
53
|
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
def fatal(message = nil, context = {})
|
55
|
+
add_if_enabled(Logger::Severity::FATAL, message || yield, context: context)
|
56
|
+
end
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
def unknown(message = nil, context = {})
|
59
|
+
add_if_enabled(Logger::Severity::UNKNOWN, message || yield, context: context)
|
60
|
+
end
|
57
61
|
|
58
|
-
|
59
|
-
|
60
|
-
|
62
|
+
def log_level_enabled?(severity)
|
63
|
+
severity >= level
|
64
|
+
end
|
61
65
|
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
67
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
91
|
-
|
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.
|
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/
|
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:
|
70
|
+
version: 1.3.1
|
69
71
|
requirements: []
|
70
72
|
rubyforge_project:
|
71
73
|
rubygems_version: 2.6.13
|