class ContextualLogger::LoggerWithContext
A logger that deep_merges additional context and then delegates to the given logger. Keeps it own log level (called override_level
) that may be set independently of the logger it delegates to. If override_level
is non-nil, it takes precedence; if it is nil (the default), then it delegates to the logger.
Attributes
context[R]
logger[R]
override_level[R]
Public Class Methods
new(logger, context, level: nil)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 14 def initialize(logger, context, level: nil) logger.is_a?(LoggerMixin) or raise ArgumentError, "logger must include ContextualLogger::LoggerMixin (got #{logger.inspect})" @logger = logger self.level = level @context = normalize_context(context) @merged_context_cache = {} # so we don't have to merge every time end
Private Class Methods
for_log_source(logger, log_source, level: nil)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 65 def for_log_source(logger, log_source, level: nil) new(logger, { log_source: log_source }, level: level) end
Public Instance Methods
level()
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 22 def level @override_level || @logger.level end
level=(override_level)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 26 def level=(override_level) @override_level = (ContextualLogger.normalize_log_level(override_level) if override_level) end
write_entry_to_log(severity, timestamp, progname, message, context:)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 30 def write_entry_to_log(severity, timestamp, progname, message, context:) merged_context = if @merged_context_cache.size >= 1000 # keep this cache memory use finite @merged_context_cache[context] || @context.deep_merge(context) else @merged_context_cache[context] ||= @context.deep_merge(context) end @logger.write_entry_to_log(severity, timestamp, progname, message, context: merged_context) end
Private Instance Methods
deep_key_has_string?(hash)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 57 def deep_key_has_string?(hash) hash.any? do |key, value| key.is_a?(String) || (value.is_a?(Hash) && deep_key_has_string?(value)) end end
normalize_context(context)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 43 def normalize_context(context) if warn_on_string_keys(context) context.deep_symbolize_keys else context end end
warn_on_string_keys(context)
click to toggle source
# File lib/contextual_logger/logger_with_context.rb, line 51 def warn_on_string_keys(context) if deep_key_has_string?(context) ActiveSupport::Deprecation.warn('Context keys must use symbols not strings. This will be asserted as of contextual_logger v1.0.0') end end