ruby on rails - rails - pone vs logger en tareas de rake de rieles
ruby on rails run migrations (8)
En una tarea de rake si uso 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.
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.
Idealmente, me gustaría utilizar Rails.logger.info y en el modo de desarrollo dentro de la tarea de rake, la salida del registrador también debe enviarse a la consola.
¿Hay alguna manera de lograr eso?
Código
Para Rails 4 y posteriores, puede usar la transmisión Logger .
Si desea obtener tanto STDOUT como el registro de archivos para las tareas de rake en modo de desarrollo, puede agregar este código a config/environments/development.rb
:
if File.basename($0) == ''rake''
# http://.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
Aquí hay una pequeña tarea de Rake para probar el código anterior:
# 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
Ejecutando rake stdout_and_log:test
resultados de rake stdout_and_log:test
HELLO FROM PUTS
HELLO FROM LOGGER
mientras
HELLO FROM LOGGER
ha sido agregado a log/development.log
.
Ejecutando rake stdout_and_log:test RAILS_ENV=production
salida
HELLO FROM PUTS
mientras
HELLO FROM LOGGER
ha sido agregado a log/production.log
.
¿Qué tal crear una aplicación que ayuda a detectar qué entorno se está ejecutando y que hace lo correcto?
def output_debug(info)
if RAILS_ENV == "development"
puts info
else
logger.info info
end
end
A continuación, llame a output_debug en lugar de puts o logger.info
Ejecute un trabajo en segundo plano con ''&'' y abra el script / consola o lo que sea .. De esa manera 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 descuidarse rápidamente cuando hay una gran cantidad de salida de registro.
En Rails 2.X para redirigir el registrador a STDOUT en modelos:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Para redirigir el registrador a los controladores:
ActionController::Base.logger = Logger.new(STDOUT)
Las tareas de rastreo son ejecutadas por un usuario, en una línea de comandos. Todo lo que necesiten saber de inmediato ("5 filas procesadas") se debe generar en el terminal con puts
.
Todo lo que deba conservarse para la posteridad ("mensaje de advertencia enviado a [email protected]") debe enviarse a Rails.logger
.
Puede crear una nueva tarea de rake para que esto funcione.
desc "switch logger to stdout"
task :to_stdout => [:environment] do
Rails.logger = Logger.new(STDOUT)
end
De esta forma, cuando ejecutas tu tarea de rake, puedes agregar to_stdout primero para obtener los mensajes de registro estándar o no incluirlos para enviar los mensajes al archivo de registro predeterminado.
rake to_stdout some_task
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 conocen el comando ''cola'' de UNIX®, que se puede usar para mostrar 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'' al comando ''cola''. Esto hace que la cola ''siga'' la salida del archivo. Inicialmente, la respuesta será la misma que para ''tail'' por sí mismo: se mostrarán las últimas líneas del archivo. Sin embargo, el comando no vuelve al aviso, y en su lugar, continúa ''seguir'' el archivo. Cuando se agregan líneas adicionales al archivo, se mostrarán en la terminal. Esto es muy útil para ver archivos de registro o cualquier otro archivo que pueda agregarse a lo largo del tiempo. Escriba ''man tail'' para obtener más detalles sobre esta y otras opciones de cola.
( via )
Pon esto en application.rb
, o en un código de inicialización de la tarea de rake
if defined?(Rails) && (Rails.env == ''development'')
Rails.logger = Logger.new(STDOUT)
end
Este es el código de Rails 3. Tenga en cuenta que esto anulará el registro en development.log
. Si desea tanto STDOUT
como 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
.