2011-10-19 8 views
5

Esta es una pregunta de dos partes, pero puede tener la misma respuesta.Buscando opciones de registro de grano más fino en Rails. ¿Cómo puedo registrar solicitudes completas y/o filtros individuales en archivos de registro alternativos?

parte: En nuestra aplicación, un controlador particular, recibe un golpe mucho - tanto es así que nos gustaría que se registra en un archivo separado de todas las demás solicitudes. Configurar el FoosController.logger no es lo que estoy buscando, porque la solicitud ejercita algunos archivos lib y objetos de registro activos que tienen su objeto registrador, y los rieles registrarán cierta información antes de entregar el control al controlador en cuestión.

segunda parte: Tenemos un mundial antes del filtro incluido en nuestra application_controller.rb raíz que se ejecuta antes de que la mayoría de las acciones de la mayoría de los controladores. Este before_filter es muy prolijo en los registros, y es un candidato para enviar toda su información de registro a un archivo separado. Este filtro anterior también llama a Libs y al código ActiveRecord con sus propias referencias al registrador.

Una posible solución es ejecutar el controlador único como su propia aplicación independiente. No lo he intentado todavía, porque está muy relacionado con las aplicaciones internas de la aplicación. Este enfoque tampoco ayuda con el before_filter.

¿Hay alguna buena solución para un registro más detallado en las aplicaciones de rieles?

Gracias!

Respuesta

1

para la Parte I recomiendo la creación de su propia clase de logger (posiblemente heredar del registrador de rubí (1), tienen el registrador de filtrar la solicitud de URL y en base a ese registro en un archivo específico.

para la segunda parte la solución más fácil sería sólo tiene que utilizar un registrador por separado para estos métodos. en lugar de logger.debug "su mensaje" que acaba de llamar method_logger.debug "su mensaje".

creación de su propio registrador está simple, solo use la clase de registrador de ruby ​​(1). El código g crea un registrador que se conecta a un archivo my_method.log en el directorio de registros de la aplicación de rieles.

method_logger = Logger.new(Rails.root.join('logs','my_method.log') 

entonces usted puede escribir a su registro con el siguiente comando, lo que debería resultar familiar a usted como rieles utiliza el registrador de Rubí también.

method_logger.debug "your debug message here" 

(1) http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html

1

Aquí está el código de un registrador personalizado que puede usar para resolver la Parte I. Lo adapté para mi propio uso en another Stack Overflow question, incluso incluyendo los comentarios en línea del remitente.La diferencia principal es que se puede especificar una ruta de registro diferente para el desarrollo y producción:

# app/concerns/event_notifications_logger.rb 
class EventNotificationsLogger < Rails::Rack::Logger 
    def initialize(app, opts = {}) 
    @default_logger = Rails.logger 

    @notifications_logger = Logger.new(notifications_log_path) 
    @notifications_logger.formatter = LogFormat.new 
    @notifications_logger.level = @default_logger.level 

    @app = app 
    @opts = opts 
    end 

    def call(env) 
    logger = if env['PATH_INFO'] == '/event_notifications/deliver' 
     @notifications_logger 
    else 
     @default_logger 
    end 

    # What?! Why are these all separate? 
    ActiveRecord::Base.logger = logger 
    ActionController::Base.logger = logger 
    Rails.logger = logger 

    # The Rails::Rack::Logger class is responsible for logging the 
    # 'starting GET blah blah' log line. We need to call super here (as opposed 
    # to @app.call) to make sure that line gets output. However, the 
    # ActiveSupport::LogSubscriber class (which Rails::Rack::Logger inherits 
    # from) caches the logger, so we have to override that too 
    @logger = logger 

    super 
    end 

private 

    def notifications_log_path 
    Rails.env.production? ? '/var/log/event-notifications.log' : Rails.root.join('log/event-notifications.log') 
    end 
end 

Entonces incluirlo en su configuración de la aplicación:

require File.expand_path('../boot', __FILE__) 
require 'rails/all' 

require File.expand_path('../../app/concerns/event_notifications_logger', __FILE__) 

module YourApp 
    class Application < Rails::Application 
    config.middleware.swap Rails::Rack::Logger, EventNotificationsLogger 
    # ... 
    end 
end 
Cuestiones relacionadas