Class: ExisRay::LogSubscriber

Inherits:
ActiveSupport::LogSubscriber
  • Object
show all
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

Instance Method Summary collapse

Class Method Details

.attached?Boolean

Returns:

  • (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.

Parameters:

  • event (ActiveSupport::Notifications::Event)

Returns:

  • (Hash)


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.

Parameters:

  • event (ActiveSupport::Notifications::Event)


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.message,
                   payload_summary: event.payload.slice(:controller, :action, :method, :path)
                 })
  rescue StandardError
    nil
  end
end