Module: DebugBundle::Logging

Defined in:
lib/debugbundle/logging.rb

Defined Under Namespace

Classes: SemanticLoggerAppender

Constant Summary collapse

RECURSION_GUARD_KEY =
:__debugbundle_logger_capture_active__
LOGGER_LEVEL_NAMES =
{
  ::Logger::DEBUG => :debug,
  ::Logger::INFO => :info,
  ::Logger::WARN => :warning,
  ::Logger::ERROR => :error,
  ::Logger::FATAL => :fatal,
  ::Logger::UNKNOWN => :critical
}.freeze

Class Method Summary collapse

Class Method Details

.install_semantic_logger(client:) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/debugbundle/logging.rb', line 44

def self.install_semantic_logger(client:)
  return nil unless defined?(::SemanticLogger)
  return nil unless ::SemanticLogger.respond_to?(:add_appender)

  appender = SemanticLoggerAppender.new(client: client)
  ::SemanticLogger.add_appender(appender: appender)
  appender
end

.install_stdlib_logger(logger, client:) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/debugbundle/logging.rb', line 17

def self.install_stdlib_logger(logger, client:)
  interceptor = Module.new do
    define_method(:add) do |severity, message = nil, progname = nil, &block|
      was_capturing = Thread.current[RECURSION_GUARD_KEY]
      unless was_capturing
        Thread.current[RECURSION_GUARD_KEY] = true
        resolved_message = message
        resolved_message = block.call if resolved_message.nil? && block
        resolved_message = progname if resolved_message.nil?

        client.capture_log(
          resolved_message.to_s,
          level: LOGGER_LEVEL_NAMES.fetch(severity || ::Logger::UNKNOWN, :warning),
          context: { logger_name: logger.progname }
        )
      end

      super(severity, message, progname, &block)
    ensure
      Thread.current[RECURSION_GUARD_KEY] = was_capturing
    end
  end

  logger.singleton_class.prepend(interceptor)
  interceptor
end