run rails migrations generate example commands ruby-on-rails rake

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 .