Class: BetterAuth::Telemetry::LoggerAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/better_auth/telemetry/logger_adapter.rb

Overview

Thin wrapper that normalizes any logger-shaped object into the two-method surface the telemetry pipeline depends on: ‘#info(message)` and `#error(message)`. Every dispatch is wrapped in a `rescue StandardError` so a misbehaving logger can never propagate out of telemetry code paths (Requirements 5.5, 21.1, 21.2, 21.3).

## Per-dispatch selection rule

On every ‘#info` / `#error` call, in order:

  1. If the wrapped logger responds to the requested level (‘:info` or `:error`), call it.

  2. Otherwise, if the wrapped logger responds to ‘:call`, invoke `logger.call(level, message)`.

  3. Otherwise, fall back to ‘Kernel.warn(message)`.

Any ‘StandardError` raised by the chosen step is swallowed and the call returns `nil`. Non-`StandardError` exceptions (`Interrupt`, `SystemExit`, `SignalException`, `NoMemoryError`) are intentionally allowed to propagate.

## Construction

Use LoggerAdapter.from to build an adapter from a host-supplied ‘options.logger`. When no logger is configured, the factory falls back to `BetterAuth::Logger.create` so callers always get a usable adapter that responds to `info` and `error`.

Examples:

wrap a Ruby stdlib ‘Logger`

adapter = BetterAuth::Telemetry::LoggerAdapter.from(Logger.new($stderr))
adapter.info("opted-in")

wrap a callable logger

adapter = BetterAuth::Telemetry::LoggerAdapter.from(->(level, msg) { puts "[#{level}] #{msg}" })

default fallback

adapter = BetterAuth::Telemetry::LoggerAdapter.from(nil)
adapter.error("boom") # routed through BetterAuth::Logger.create

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger) ⇒ LoggerAdapter

Returns a new instance of LoggerAdapter.

Parameters:

  • logger (Object)

    any object that responds to ‘:info`/`:error`, or that responds to `:call`, or that responds to neither (in which case dispatch falls back to `Kernel.warn`).



81
82
83
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 81

def initialize(logger)
  @logger = logger
end

Class Method Details

.callable_shape?(logger) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


74
75
76
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 74

def self.callable_shape?(logger)
  !logger.nil? && logger.respond_to?(:call)
end

.from(options_logger) ⇒ LoggerAdapter

Build a BetterAuth::Telemetry::LoggerAdapter from the host-supplied logger, falling back to the default Logger when none is configured.

Selection rules:

  • If ‘options_logger` is non-`nil` and responds to both `:info` and `:error`, wrap it as-is.

  • Else if ‘options_logger` is non-`nil` and responds to `:call`, wrap the callable.

  • Else fall back to ‘BetterAuth::Logger.create`.

Parameters:

  • options_logger (Object, nil)

    the logger to wrap; may be a ‘Logger`-shaped object, a callable (`#call(level, message)`), or `nil`.

Returns:

  • (LoggerAdapter)

    a fresh adapter with ‘#info` and `#error`.



61
62
63
64
65
66
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 61

def self.from(options_logger)
  return new(options_logger) if logger_shape?(options_logger)
  return new(options_logger) if callable_shape?(options_logger)

  new(::BetterAuth::Logger.create)
end

.logger_shape?(logger) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


69
70
71
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 69

def self.logger_shape?(logger)
  !logger.nil? && logger.respond_to?(:info) && logger.respond_to?(:error)
end

Instance Method Details

#error(message) ⇒ nil

Dispatch an error-level log entry through the wrapped logger.

Parameters:

  • message (String)

    the message to log.

Returns:

  • (nil)


97
98
99
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 97

def error(message)
  log(:error, message)
end

#info(message) ⇒ nil

Dispatch an info-level log entry through the wrapped logger.

Parameters:

  • message (String)

    the message to log.

Returns:

  • (nil)


89
90
91
# File 'lib/better_auth/telemetry/logger_adapter.rb', line 89

def info(message)
  log(:info, message)
end