2010-02-11 17 views
88

En una tarea de rake si utilizo el comando puts, entonces veo el resultado en la consola. Sin embargo, no veré ese mensaje en el archivo de registro cuando la aplicación se implemente en producción.puts vs logger in rails tareas de rake

Sin embargo, si digo Rails.logger.info entonces en modo de desarrollo no veo nada en la consola. Necesito ir al archivo de registro y seguir eso.

Lo ideal sería utilizar Rails.logger.info y en el modo de desarrollo dentro de la tarea de rake, la salida del registrador también se debe enviar a la consola.

¿Hay alguna manera de lograr eso?

+2

+1 Estaba planeando hacer la misma pregunta. –

Respuesta

9

Yo diría que usar Rails.logger.info es el camino a seguir.

No podrá verlo en la consola del servidor porque no se ejecutará a través del servidor. Simplemente abre una nueva consola y tail -f el archivo de registro, hará el truco.

Muchos usuarios son conscientes de la UNIX® comando 'cola', que se puede utilizar para pantalla las últimas líneas de un archivo grande . Esto puede ser útil para ver archivos de registro, etc.

Aún más útil en algunas situaciones, es el parámetro 'f' a la 'cola' comando. Esto provoca que la cola 'siga' la salida del archivo. Inicialmente, la respuesta será la misma que para 'cola' por sí mismo - se mostrarán las últimas líneas del archivo. Sin embargo, el comando no devuelve a la solicitud y, en su lugar, continúa para 'seguir' el archivo. Cuando se agregan líneas adicionales al archivo, se mostrarán en el terminal . Esto es muy útil para ver archivos de registro, o cualquier otro archivo que se puede anexar a lo largo del tiempo. Escriba 'man tail' para obtener más detalles sobre en esta y otras opciones de cola .

(via)

+0

Pero no es muy cómodo cuando se trabaja en la máquina local ya que no se ve el resultado en la misma ventana donde llamó la tarea. Especialmente si no tiene una pantalla grande para caber en varias ventanas una al lado de la otra. –

+9

Aún mejor es usar 'tailf'" Es similar a tail -f pero no accede al archivo cuando no está creciendo "(desde la página de manual). También es más corto – MBO

+0

@tomas ¿por qué no se minimiza la consola de registro del servidor y solo tiene una consola con la cola ejecutándose? De todos modos no es un problema real ... Me estoy ejecutando como 8 consolas rastreando lo que está pasando en mi aplicación, solo cambia entre las pestañas cuando trabajas en una parte específica del sistema no es gran cosa – marcgg

10

tareas Rake están a cargo de un usuario, en una línea de comandos. Todo lo que necesiten saber de inmediato ("5 filas procesadas") debe emitirse en el terminal con puts.

Cualquier cosa que se deba guardar para la posteridad ("envió un correo electrónico de advertencia a [email protected]") se debe enviar al Rails.logger.

+11

No es raro ejecutar tareas de rake con cron. –

+2

Es cierto. Si desea que los mensajes de registro se le envíen por correo electrónico cuando finalice la tarea cron, escupirlos a $ stdout o $ stderr. –

3

¿Qué hay de la creación de un helper de aplicación que detecta qué entorno se está ejecutando y hace lo correcto?

def output_debug(info) 
    if RAILS_ENV == "development" 
     puts info 
    else 
     logger.info info 
    end 
end 

luego llamar a output_debug en lugar de puts o logger.info

+4

No creo que esta sea una buena idea. El registrador Rails está diseñado para ser configurable, pero en lugar de usar esa configurabilidad solo estás acumulando más capas encima. –

+0

Sí, no es una buena idea, ya que se realizará el mismo control * cada vez * que desee registrar algo. – furiabhavesh

46

poner esto en application.rb, o en una tarea rake inicializar código

if defined?(Rails) && (Rails.env == 'development') 
    Rails.logger = Logger.new(STDOUT) 
end 

Ésta es Rails 3 Código. Tenga en cuenta que esto anulará el registro en development.log.Si desea ambos STDOUT y development.log, necesitará una función de envoltura.

Si desea este comportamiento solo en la consola de Rails, coloque el mismo bloque de código en su ~/.irbrc.

+1

¿cómo hago esto en los rieles 2? – Joelio

+23

¿No sería más fácil simplemente poner 'Rails.logger = Logger.new (STDOUT)' en development.rb? – ghempton

+0

Para los rieles 2, ponga esto en su development.rb: 'config.logger = Logger.new (STDOUT)' – jsarma

1

Ejecute un trabajo de fondo con '&' y abra el script/consola o lo que sea .. De esta forma puede ejecutar varios comandos en la misma ventana.

tail -f log/development.log & 
script/console 
Loading development environment (Rails 2.3.5) 
>> Product.all 
2011-03-10 11:56:00 18062 DEBUG Product Load (6.0ms) SELECT * FROM "products" 
[<Product.1>,<Product.2>] 

nota puede conseguir descuidado rápidamente cuando hay una gran cantidad de salida de registro.

2

En Rails 2.X para redirigir el registrador a la salida estándar en los modelos:

ActiveRecord::Base.logger = Logger.new(STDOUT) 

Para redirigir registrador de controladores:

ActionController::Base.logger = Logger.new(STDOUT) 
+0

También encontré este artículo, muy útil http://www.sepcot.com/blog/2009/08/ rails-logging-to-stdout –

24

Se puede crear una nueva tarea rastrillo para conseguir que esto funcione .

desc "switch logger to stdout" 
task :to_stdout => [:environment] do 
Rails.logger = Logger.new(STDOUT) 
end 

esta manera, cuando se ejecuta la tarea rake que puede agregar to_stdout primero en recibir mensajes de registro stdout o no incluirlo para que los mensajes se envían al archivo de registro predeterminado

rake to_stdout some_task 
+0

¡excelente idea! –

2

Código

Para Rails 4 y posterior, puede usar Logger broadcast.

Si desea obtener tanto la salida estándar y el registro de archivo para tareas de rastrillo en el modo de desarrollo, puede agregar este código en config/environments/development.rb:

if File.basename($0) == 'rake' 
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks 
    log_file  = Rails.root.join("log", "#{Rails.env}.log") 
    Rails.logger = ActiveSupport::Logger.new(log_file) 
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT))) 
    end 

prueba

He aquí una pequeña tarea Rake para probar lo anterior código:

# lib/tasks/stdout_and_log.rake 
namespace :stdout_and_log do 
    desc "Test if Rails.logger outputs to STDOUT and log file" 
    task :test => :environment do 
    puts "HELLO FROM PUTS" 
    Rails.logger.info "HELLO FROM LOGGER" 
    end 
end 

Correr rake stdout_and_log:test salidas

HELLO FROM PUTS 
HELLO FROM LOGGER 

mientras

HELLO FROM LOGGER 

ha sido añadido a log/development.log.

Operando rake stdout_and_log:test RAILS_ENV=production salidas

HELLO FROM PUTS 

mientras

HELLO FROM LOGGER 

ha sido añadido a log/production.log.

+0

En Rails 5, el truco 'basename ($ 0) == 'rake'' ya no funciona, porque el comando' rails' ejecuta 'rake'. Me encantaría encontrar un buen reemplazo para él más allá dependiendo de una tarea que configure la 'transmisión'. (Esa parte, al menos, todavía funciona bien). –

Cuestiones relacionadas