将vs logger放入rails rake任务中

Nic*_*ilt 107 rake ruby-on-rails

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

但是,如果我说Rails.logger.info然后在开发模式下,我在控制台上看不到任何内容.我需要去日志文件和尾部.

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

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

shm*_*ael 55

把它放入application.rb或在rake任务中初始化代码

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end
Run Code Online (Sandbox Code Playgroud)

这是Rails 3代码.请注意,这将覆盖日志记录development.log.如果你想要两者STDOUT,development.log你需要一个包装函数.

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

  • 在development.rb中放置`Rails.logger = Logger.new(STDOUT)`会不会更容易? (26认同)

Pet*_*umm 34

您可以创建一个新的rake任务来使其工作.

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

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

rake to_stdout some_task
Run Code Online (Sandbox Code Playgroud)


Jon*_*ian 11

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

任何需要为后代保留的东西("发送警告电子邮件到jsmith@example.com")都应发送给Rails.logger.

  • 用cron运行rake任务并不罕见. (13认同)
  • 真正.如果您希望在cron作业完成时通过电子邮件将日志消息发送给您,请将它们吐出到$ stdout或$ stderr. (2认同)

mar*_*cgg 10

我会说使用Rails.logger.info是要走的路.

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

许多用户都知道UNIX®命令'tail',它可用于显示大文件的最后几行.这对于查看日志文件等非常有用.

在某些情况下更有用的是'tail'命令的'-f'参数.这会导致tail'跟随'文件的输出.最初,响应将与'tail'自身相同 - 将显示文件的最后几行.但是,该命令不会返回到提示符,而是继续"跟随"该文件.当其他行添加到文件中时,它们将显示在终端上.这对于查看日志文件或可能随时间附加的任何其他文件非常有用.输入'man tail'以获取有关此选项和其他尾部选项的更多详细信息.

(通过)

  • 更好的是使用`tailf`"它类似于tail -f但是当它不增长时不访问该文件"(来自联机帮助页).它也更短 (10认同)

Eri*_*nil 9

对于Rails 4和更新版本,您可以使用Logger广播.

如果要在开发模式下同时获取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
Run Code Online (Sandbox Code Playgroud)

测试

这是一个小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
Run Code Online (Sandbox Code Playgroud)

运行rake stdout_and_log:test输出

HELLO FROM PUTS
HELLO FROM LOGGER
Run Code Online (Sandbox Code Playgroud)

HELLO FROM LOGGER
Run Code Online (Sandbox Code Playgroud)

已被添加到log/development.log.

运行rake stdout_and_log:test RAILS_ENV=production输出

HELLO FROM PUTS
Run Code Online (Sandbox Code Playgroud)

HELLO FROM LOGGER
Run Code Online (Sandbox Code Playgroud)

已被添加到log/production.log.