Class: ExisRay::LogSubscriber
- Inherits:
-
ActiveSupport::LogSubscriber
- Object
- ActiveSupport::LogSubscriber
- ExisRay::LogSubscriber
- Defined in:
- lib/exis_ray/log_subscriber.rb
Overview
Reemplaza Lograge para el logging estructurado de requests HTTP en Rails 6, 7 y 8.
Se suscribe a ‘process_action.action_controller` y emite un Hash al logger, que JsonFormatter convierte a JSON. Suprime los log subscribers por defecto de Rails (ActionController, ActionView, Rails::Rack::Logger) para evitar líneas de log duplicadas o en formato texto.
Para inyectar campos extra en cada log de request, heredá esta clase y sobreescribí ‘extra_fields`:
class MyLogSubscriber < ExisRay::LogSubscriber
def self.extra_fields(event)
{ user_agent: event.payload[:headers]["HTTP_USER_AGENT"] }
end
end
Luego configurá la subclase:
ExisRay.configure do |config|
config.log_subscriber_class = "MyLogSubscriber"
end
Class Method Summary collapse
- .attached? ⇒ Boolean
-
.extra_fields(_event) ⇒ Hash
Hook para que las subclases inyecten campos extra en cada log de request.
-
.install! ⇒ void
Activa el subscriber correcto (subclase configurada o ExisRay::LogSubscriber por defecto) y suprime los log subscribers por defecto de Rails.
Instance Method Summary collapse
-
#process_action(event) ⇒ void
Procesa el evento de finalización de un request HTTP y lo emite como Hash estructurado.
Class Method Details
.attached? ⇒ Boolean
76 77 78 79 80 |
# File 'lib/exis_ray/log_subscriber.rb', line 76 def self.attached? ActiveSupport::LogSubscriber.log_subscribers.any? { |s| s.is_a?(subscriber_class) } rescue StandardError false end |
.extra_fields(_event) ⇒ Hash
Hook para que las subclases inyecten campos extra en cada log de request. Por defecto retorna un Hash vacío.
58 59 60 |
# File 'lib/exis_ray/log_subscriber.rb', line 58 def self.extra_fields(_event) {} end |
.install! ⇒ void
This method returns an undefined value.
Activa el subscriber correcto (subclase configurada o ExisRay::LogSubscriber por defecto) y suprime los log subscribers por defecto de Rails.
68 69 70 71 72 73 74 |
# File 'lib/exis_ray/log_subscriber.rb', line 68 def self.install! return if attached? suppress_default_log_subscribers! suppress_rack_logger! subscriber_class.attach_to(:action_controller) end |
Instance Method Details
#process_action(event) ⇒ void
This method returns an undefined value.
Procesa el evento de finalización de un request HTTP y lo emite como Hash estructurado.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/exis_ray/log_subscriber.rb', line 33 def process_action(event) payload = build_payload(event) if payload[:http_status] && payload[:http_status] >= 500 logger.error(payload) else logger.info(payload) end rescue StandardError => e begin logger.error({ component: "exis_ray", event: "log_subscriber_fallback", error: e., payload_summary: event.payload.slice(:controller, :action, :method, :path) }) rescue StandardError nil end end |