Module: Tracelit::RailsLoggerBridge

Defined in:
lib/tracelit/rails_logger_bridge.rb

Overview

RailsLoggerBridge adds an OpenTelemetry log emitter to Rails.logger so that every Rails.logger call is also forwarded to the OTel LoggerProvider and exported via OTLP to the Tracelit logs table.

It works by broadcasting a lightweight Logger subclass (OTelLogger) alongside the existing logger. In Rails 7.1+, Rails.logger is already an ActiveSupport::BroadcastLogger, so we call broadcast_to directly. In older setups we wrap it in a new BroadcastLogger.

Severity mapping (OTel SeverityNumber spec):

Rails DEBUG (0) → OTel 5  (SEVERITY_NUMBER_DEBUG)
Rails INFO  (1) → OTel 9  (SEVERITY_NUMBER_INFO)
Rails WARN  (2) → OTel 13 (SEVERITY_NUMBER_WARN)
Rails ERROR (3) → OTel 17 (SEVERITY_NUMBER_ERROR)
Rails FATAL (4) → OTel 21 (SEVERITY_NUMBER_FATAL)
Rails UNKNOWN   → OTel 1  (SEVERITY_NUMBER_TRACE)

Defined Under Namespace

Classes: OTelLogger

Constant Summary collapse

SEVERITY_MAP =
[5, 9, 13, 17, 21, 1].freeze

Class Method Summary collapse

Class Method Details

.install(logger_provider) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/tracelit/rails_logger_bridge.rb', line 23

def self.install(logger_provider)
  return unless defined?(::Rails) && ::Rails.logger

  otel_logger = logger_provider.logger(
    name:    "rails",
    version: Tracelit::VERSION
  )

  otel_sink = OTelLogger.new(otel_logger)

  if ::Rails.logger.is_a?(ActiveSupport::BroadcastLogger)
    ::Rails.logger.broadcast_to(otel_sink)
  else
    ::Rails.logger = ActiveSupport::BroadcastLogger.new(
      ::Rails.logger,
      otel_sink
    )
  end
rescue StandardError => e
  warn "Tracelit: failed to install Rails logger bridge: #{e.message}"
end