将vslogging器放入Rake Rake任务中
在rake任务中,如果我使用puts命令然后我看到在控制台上的输出。 但是,当应用程序部署在生产环境中时,我不会在日志文件中看到该消息。
但是,如果我说Rails.logger.info然后在开发模式下,我什么都看不到在控制台上。 我需要去日志文件和尾巴。
我希望在Rake任务中使用Rails.logger.info和开发模式,logging器的输出也应该发送到控制台。
有没有办法做到这一点?
把它放在application.rb
,或者在rake任务中初始化代码
if defined?(Rails) && (Rails.env == 'development') Rails.logger = Logger.new(STDOUT) end
这是Rails 3的代码。 请注意,这将覆盖logging到development.log
。 如果你想同时使用STDOUT
和development.log
你需要一个包装函数。
如果您只想在Rails控制台中使用这种行为,请在~/.irbrc
放入相同的代码块。
你可以创build一个新的rake任务来使这个工作。
desc "switch logger to stdout" task :to_stdout => [:environment] do Rails.logger = Logger.new(STDOUT) end
这样,当你执行你的rake任务时,你可以先添加to_stdout来获取标准输出日志消息,或者不包含它来将消息发送到默认日志文件
rake to_stdout some_task
Rake任务由用户在命令行上运行。 任何他们需要马上知道的东西(“已处理的5行”)应该在terminal上输出。
任何需要为后代保留(“发送警告电子邮件到jsmith@example.com”)应该被发送到Rails.logger
。
我会说,使用Rails.logger.info
是要走的路。
您将无法在服务器控制台中看到它,因为它不会通过服务器运行。 只要打开一个新的控制台,并tail -f
的日志文件,它会做的伎俩。
许多用户都知道UNIX®命令“tail”,它可以用来显示大文件的最后几行。 这可以用于查看日志文件等
在某些情况下更为有用的是“tail”命令的'-f'参数。 这会导致尾部“跟随”文件的输出。 最初,响应将与“尾巴”相同 – 文件的最后几行将被显示。 但是,该命令不会返回到提示符,而是继续“跟随”该文件。 当附加行被添加到文件时,它们将显示在terminal上。 这对于观看日志文件或随着时间的推移可能附加的任何其他文件是非常有用的。 input'man tail'以获得更多关于这个和其他尾部选项的细节。
( 通过 )
如何创build一个应用程序帮助,检测哪个环境正在运行,并做正确的事情?
def output_debug(info) if RAILS_ENV == "development" puts info else logger.info info end end
然后调用output_debug而不是puts或logger.info
在Rails 2.X中将logging器redirect到模型中的STDOUT:
ActiveRecord::Base.logger = Logger.new(STDOUT)
将logging器redirect到控制器中:
ActionController::Base.logger = Logger.new(STDOUT)
用'&'执行一个后台作业,然后打开脚本/控制台或者其他的东西。这样你可以在同一个窗口中运行多个命令。
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>]
注意当有很多日志logging输出时,可能会马上变得松散。
码
对于Rails 4和更新版本,您可以使用Logger广播 。
如果您想在开发模式下获取用于rake任务的STDOUT和文件日志logging,则可以将此代码添加到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
testing
这里有一个小Rake任务来testing上面的代码:
# 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
运行rake stdout_and_log:test
输出
HELLO FROM PUTS HELLO FROM LOGGER
而
HELLO FROM LOGGER
已经被添加到log/development.log
。
运行rake stdout_and_log:test RAILS_ENV=production
输出
HELLO FROM PUTS
而
HELLO FROM LOGGER
已被添加到log/production.log
。