Class: ExisRay::JsonFormatter

Inherits:
Logger::Formatter
  • Object
show all
Includes:
ActiveSupport::TaggedLogging::Formatter
Defined in:
lib/exis_ray/json_formatter.rb

Overview

Formateador global que intercepta todos los logs de la aplicación y los emite en formato JSON.

Esta clase hereda de ‘Logger::Formatter` y tiene la responsabilidad unificada de estandarizar la salida para peticiones HTTP (procesadas previamente vía Lograge), trabajos en segundo plano (Sidekiq), tareas programadas (Rake/Cron) y cualquier mensaje arbitrario enviado explícitamente a `Rails.logger`.

Automáticamente inyecta el contexto de trazabilidad (Tracer) y el contexto de negocio (Current) en cada línea de log.

Constant Summary collapse

KV_DETECT_RE =

Detecta si un string comienza con al menos un par key=value.

/\A\w+=/
KV_PARSE_RE =

Extrae pares key=value de un string. Soporta valores entre comillas dobles/simples o valores sin comillas que se extienden hasta el próximo token key= o fin de string.

/(\w+)=("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|(?:(?!\s+\w+=).)+)/
SENSITIVE_KEYS =

Claves sensibles que deben filtrarse automáticamente según el estándar de Gabriel.

/password|pass|passwd|secret|token|api_key|auth/i
SEVERITY_NUMBER =

Mapeo de severity_text OTel a SeverityNumber del Log Data Model. opentelemetry.io/docs/specs/otel/log/data-model/#field-severitynumber

{
  "DEBUG" => 5,
  "INFO" => 9,
  "WARN" => 13,
  "ERROR" => 17,
  "FATAL" => 21
}.freeze

Instance Method Summary collapse

Instance Method Details

#call(severity, timestamp, _progname, msg) ⇒ String

Procesa un mensaje de log y lo formatea como una cadena estructurada en JSON.

Parameters:

  • severity (String)

    El nivel de severidad del log (ej. “INFO”, “ERROR”, “DEBUG”).

  • timestamp (Time)

    La marca de tiempo en la que se generó el log.

  • _progname (String, nil)

    El nombre del programa o aplicación (ignorado aquí).

  • msg (String, Hash, Object)

    El mensaje a registrar. Puede ser un Hash (inyectado por Lograge) o un String.

Returns:

  • (String)

    Una cadena en formato JSON terminada con un salto de línea (n).



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/exis_ray/json_formatter.rb', line 49

def call(severity, timestamp, _progname, msg)
  payload = {
    time: timestamp&.utc&.iso8601 || Time.now.utc.iso8601,
    level: severity,
    severity_number: SEVERITY_NUMBER[severity],
    service: ExisRay::Tracer.service_name,
    service_version: service_version,
    deployment_environment: deployment_environment
  }

  inject_tracer_context(payload)
  inject_business_context(payload)
  inject_current_tags(payload)
  process_message(payload, msg)

  "#{JSON.generate(payload.compact, { ascii_only: false })}\n"
rescue StandardError
  fallback_message(severity, timestamp, msg)
end