将vs logger放入rails rake任务中

时间:2010-02-11 17:05:09

标签: ruby-on-rails rake

在rake任务中,如果我使用puts命令,那么我在控制台上看到输出。但是,在生产中部署应用程序时,我不会在日志文件中看到该消息。

但是如果我说Rails.logger.info然后在开发模式下我在控制台上看不到任何内容。我需要去记录文件并拖尾。

我理想情况下喜欢使用Rails.logger.info并在rake任务中的开发模式下,logger的输出也应该发送到控制台。

有没有办法实现这个目标?

8 个答案:

答案 0 :(得分:53)

将其放在application.rb或rake任务初始化代码

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

这是Rails 3代码。请注意,这将覆盖到development.log的日志记录。如果您同时需要STDOUTdevelopment.log,则需要包装函数。

如果您只想在Rails控制台中使用此行为,请在~/.irbrc中放置相同的代码块。

答案 1 :(得分:30)

您可以创建一个新的rake任务以使其正常工作。

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

这样,当您执行rake任务时,可以先添加to_stdout以获取stdout日志消息,或者不包含它以将消息发送到默认日志文件

rake to_stdout some_task

答案 2 :(得分:11)

Rake任务由用户在命令行上运行。他们需要立即知道的任何事情(“处理过的5行”)应该在终端上输出puts

任何需要为后代保留的内容(“发送警告电子邮件至jsmith@example.com”)都应发送至Rails.logger

答案 3 :(得分:10)

我会说使用Rails.logger.info是可行的方法。

您将无法在服务器控制台中看到它,因为它不会通过服务器运行。只需打开一个新的控制台和tail -f日志文件,就可以了。

  

许多用户都了解UNIX®   命令'tail',可以用来   显示一个大的最后几行   文件。这对查看非常有用   日志文件等

     

在某些情况下更有用,   是'尾'的'-f'参数   命令。这导致尾巴“跟随”   文件的输出。最初,   回应将是相同的   “尾巴”本身 - 最后几行   将显示该文件。   但是,该命令不会返回   到提示,而是继续   '跟随'文件。额外的时候   他们会将这些行添加到文件中   显示在终端上。这是   对于查看日志文件非常有用,或者   任何其他可能附加的文件   随着时间的推移。输入“man tail”了解更多信息   关于这个和其他尾巴的细节   选项。

via

答案 4 :(得分:8)

代码

对于Rails 4及更新版本,您可以使用Logger broadcast

如果要在开发模式下同时获取rake任务的STDOUT和文件日志记录,可以将此代码添加到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

测试

这是一个小的Rake任务来测试上面的代码:

# 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

答案 5 :(得分:4)

如何创建一个应用程序帮助程序来检测正在运行的环境并做正确的事情?

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

然后调用output_debug而不是puts或logger.info

答案 6 :(得分:3)

在Rails 2.X中将记录器重定向到模型中的STDOUT:

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

要在控制器中重定向记录器:

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

答案 7 :(得分:2)

使用'&'执行后台作业并打开脚本/控制台或其他.. 这样你就可以在同一个窗口中运行多个命令。

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>]

note 当有大量日志记录输出时,可以快速变得草率。