Class: Dinie::Internal::RuntimeLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/dinie/runtime/logger.rb

Overview

Leveled logging facade with PII redaction (architecture §9, RB12). Owns the effective level (resolved once) and an injectable sink; gates every call and routes request/response detail through LogRedaction before emitting. Constructed by Middleware::Logging from the ‘log_level:` / `logger:` the Client captured.

Defaults to ‘:off` — a financial SDK emits nothing unless the caller opts in. Mirrors the leveling/redaction approach of the TS `RuntimeLogger`; the divergence is the **hook point** (TS owns a custom logger instance; Ruby fills the OpenAI-Ruby gap with a Faraday middleware —the `comparison.md` axis).

Constant Summary collapse

LEVELS =

Level ordering for gating: a call at ‘level` emits when `level <= configured` (so `:off` emits nothing, `:debug` emits everything).

{ off: 0, error: 1, warn: 2, info: 3, debug: 4 }.freeze
ENV_VAR =

Environment variable read when no explicit ‘level:` is given.

"DINIE_LOG"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(level: nil, logger: nil, env: ENV.fetch(ENV_VAR, nil)) ⇒ RuntimeLogger

Returns a new instance of RuntimeLogger.

Parameters:

  • level (Symbol, String, nil) (defaults to: nil)

    explicit level; a valid one wins over the env var

  • logger (Object, nil) (defaults to: nil)

    custom sink responding to ‘#debug/#info/#warn/#error` (default `::Logger.new($stdout)`)

  • env (String, nil) (defaults to: ENV.fetch(ENV_VAR, nil))

    ‘DINIE_LOG` override (injectable for tests)



162
163
164
165
# File 'lib/dinie/runtime/logger.rb', line 162

def initialize(level: nil, logger: nil, env: ENV.fetch(ENV_VAR, nil))
  @level = resolve_level(level, env)
  @sink = logger || ::Logger.new($stdout)
end

Instance Attribute Details

#levelSymbol (readonly)

The effective level after ‘level:` + `DINIE_LOG` resolution.

Returns:

  • (Symbol)


156
157
158
# File 'lib/dinie/runtime/logger.rb', line 156

def level
  @level
end

Instance Method Details

#debug(message) ⇒ void

This method returns an undefined value.



182
# File 'lib/dinie/runtime/logger.rb', line 182

def debug(message) = emit(:debug, message)

#enabled?(level) ⇒ Boolean

Whether a call at ‘level` would emit under the configured level.

Parameters:

  • level (Symbol)

    one of LEVELS

Returns:

  • (Boolean)


171
172
173
# File 'lib/dinie/runtime/logger.rb', line 171

def enabled?(level)
  LEVELS.fetch(level) <= LEVELS.fetch(@level)
end

#error(message) ⇒ void

This method returns an undefined value.



176
177
# File 'lib/dinie/runtime/logger.rb', line 176

def error(message) = emit(:error, message)
# @return [void]

#info(message) ⇒ void

This method returns an undefined value.



180
181
# File 'lib/dinie/runtime/logger.rb', line 180

def info(message) = emit(:info, message)
# @return [void]

#log_request(method:, url:, headers:, body:, correlation:) ⇒ void

This method returns an undefined value.

Log an outgoing request at ‘debug` with redacted headers + body and the correlation triple.

Parameters:

  • method (Symbol, String)

    HTTP method

  • url (String)

    request URL

  • headers (#each, nil)

    request headers

  • body (Object, nil)

    request body

  • correlation (Hash)

    ‘request_log_id` / `retry_of` / `attempt`



192
193
194
195
196
# File 'lib/dinie/runtime/logger.rb', line 192

def log_request(method:, url:, headers:, body:, correlation:)
  return unless enabled?(:debug)

  emit_line("→ request", correlation.merge(method: method.to_s.upcase, url: url), headers, body)
end

#log_response(status:, url:, headers:, body:, duration_ms:, request_id:, correlation:) ⇒ void

This method returns an undefined value.

Log an incoming response at ‘debug` with redacted headers + body, duration, and request id.

Parameters:

  • status (Integer)

    HTTP status

  • url (String)

    request URL

  • headers (#each, nil)

    response headers

  • body (Object, nil)

    response body

  • duration_ms (Float)

    round-trip time in milliseconds

  • request_id (String, nil)

    the response ‘X-Request-Id` (APM correlation)

  • correlation (Hash)

    ‘request_log_id` / `retry_of` / `attempt`



208
209
210
211
212
213
# File 'lib/dinie/runtime/logger.rb', line 208

def log_response(status:, url:, headers:, body:, duration_ms:, request_id:, correlation:) # rubocop:disable Metrics/ParameterLists
  return unless enabled?(:debug)

  fields = correlation.merge(status: status, url: url, duration_ms: duration_ms, request_id: request_id)
  emit_line("← response", fields, headers, body)
end

#warn(message) ⇒ void

This method returns an undefined value.



178
179
# File 'lib/dinie/runtime/logger.rb', line 178

def warn(message) = emit(:warn, message)
# @return [void]