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.}" end |