2011-03-21 14 views
12

¿Es posible que el registrador Ruby estándar (es decir, ::Logger) se descargue automáticamente después de cada escritura?¿Se puede configurar el registrador Ruby estándar para que se descargue después de cada mensaje?

Actualización: estoy fijando un formateador de registro personalizado, según How to get timestamps in your ruby on rails logs:

class Foo 
    def initialize(params = {}) 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    # ... 
    end 

    class LogFormatter < Logger::Formatter 
    def call(severity, time, progname, message) 
     timestamp = time.iso8601 
     log_msg = "#{timestamp}#{" [#{severity}]" if %w{ERROR WARN}.include? severity} " 
     if message.is_a? Exception 
     log_msg += "#{message.message}" 
     log_msg += ": #{message.backtrace.join "\n#{timestamp} "}" unless message.backtrace.blank? 
     else 
     log_msg += message 
     end 

     "#{log_msg}\n" 
    end 
    end 
end 

He intentado utilizar la sugerencia de idlefingers de la siguiente manera:

def initialize(params = {}) 
    Rails.logger.auto_flushing = 1 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    end 

Pero no dados. Tampoco funciona @logger.auto_flushing = 1 para mí. ¿Qué estoy haciendo mal?

Actualización: Resulta que ActiveSupport de ::Logger simplemente envuelve el estándar de Ruby ::Logger. Entonces mi pregunta es sobre Ruby y no sobre Rails, después de todo.

Respuesta

23

Resulta que era sólo una cuestión de encender el atributo sync del objeto que subyace IO:

def initialize(params = {}) 
    $stdout.sync = true unless RAILS_ENV == 'production' 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    end 
3

Conjunto ActiveSupport::BufferedLogger.auto_flushing en su entorno, así:

Rails.logger.auto_flushing = 1 

Esto debería hacer más al ras después de cada mensaje.

+0

no funciona para mí (ver mi actualización a la pregunta). –

+0

Eso es completamente diferente al registrador Rails (y su pregunta original). No estoy seguro de cómo hacerlo con un registro personalizado usando stdout. Puede usar [io.sync = true] (http://www.ruby-doc.org/core/classes/IO.html#M000911) para el registro de archivos, pero tendrá que buscarlo en google para el registro de stdout. – idlefingers

+0

Ah, está bien. Pensé que Logger * era * el registrador estándar de Rails. : -/ –

Cuestiones relacionadas