Class: ExisRay::JsonFormatter
- Inherits:
-
Logger::Formatter
- Object
- Logger::Formatter
- ExisRay::JsonFormatter
- 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
-
#call(severity, timestamp, _progname, msg) ⇒ String
Procesa un mensaje de log y lo formatea como una cadena estructurada en JSON.
Instance Method Details
#call(severity, timestamp, _progname, msg) ⇒ String
Procesa un mensaje de log y lo formatea como una cadena estructurada en JSON.
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, , _progname, msg) payload = { time: &.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) (payload) (payload, msg) "#{JSON.generate(payload.compact, { ascii_only: false })}\n" rescue StandardError (severity, , msg) end |