【问题标题】:log doesn't work in production with delayed job日志在工作延迟的生产中不起作用
【发布时间】:2011-01-12 19:36:39
【问题描述】:

我遇到了一些奇怪的问题,我的延迟作业在生产中失败了。最后我把它缩小到记录器。如果我注释掉我的日志函数调用,一切正常。但是,如果我尝试登录,我会在 delay_job 处理程序中得到这个:

 --- !ruby/struct:Delayed::PerformableMethod 
object: AR:User:1
method: :load_and_update_without_send_later
args: []

 | closed stream
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/opt/ruby/lib/ruby/1.8/logger.rb:496:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:326:in `add'
/opt/ruby/lib/ruby/1.8/logger.rb:374:in `info'
/home/rails/myapp.com/releases/20100203203031/app/models/gmail.rb:35:in `log'

我的记录器如下所示:

@@error_log_file = File.open("#{RAILS_ROOT}/log/error.log", 'a')
@@error_log_file.sync = true
def log(msg)
  msg.each do |line|
    line = "#{Time.now.strftime('%H:%M:%S')}  #{line}"
    @@error_log_file.info(line) # this is line 35 where it's failing
    puts line
  end
end

如果我注释掉“@@error_log_file.sync = true”这一行,它也可以工作。

这是作业延迟问题,还是与我的日志目录是符号链接有关(由标准 capistrano 部署设置)?

我的 error.log 文件中也没有任何内容被写入,delayed_job.log 中也没有任何内容被写入。完全被难住了...

【问题讨论】:

  • 所以在做了更多测试之后,看起来“config.cache_classes = true”是导致这些错误发生的生产环境设置。这是否让任何人对它发生的原因有了新的想法?即使 config.cache_classes = false,delayed_job 也不会写入生产环境中的 log/delayed_job.log。

标签: ruby-on-rails ruby capistrano delayed-job


【解决方案1】:

Woody Peterson 在这里发现了问题:http://groups.google.com/group/delayed_job/browse_thread/thread/f7d0534bb6c7c83f/37b4e8ed7bfaba42

问题是:

DJ 在生产中使用 Rails 的缓冲日志,并且由于某种原因没有触发刷新缓冲区(不知道它是按缓冲区大小刷新还是在请求后显式刷新)。

临时修复(感谢 Nathan Phelps)是:

在生产中,缓冲日志设置为 auto_flushing 值 1000,这意味着在记录 1000 条消息之前不会调用刷新。假设您使用的是collectiveidea的delayed_job分支,您可以在第64行初始化记录器后立即在command.rb中将auto_flushing设置为更合理的值来解决这个问题。IE

延迟::Worker.logger = Rails.logger

Delayed::Worker.logger.auto_flushing = 1 # 或其他

非常适合我!

【讨论】:

  • 这适用于哪些版本的 Ruby / RoR?我在 ruby​​ 1.9.2 和 rails 3.2.8 上得到undefined method 'auto_flushing'=
【解决方案2】:

您似乎正在尝试登录到已关闭的文件。您是否考虑过尝试 SyslogLogger gem?

这里是an article on how to use it with rails,应该可以帮助您入门。

【讨论】:

  • 谢谢,检查一下。这里我只是使用 Logger。但我不认为它应该是一个关闭的文件,因为我明确地打开它......而且它在开发模式下工作正常。此外,delayed_job 并没有将它通常的日志记录写入 log/delayed_job.log ——这是我无法修改的。
【解决方案3】:

我也遇到过类似的问题。正在重写collectiveidea fork 中的日志记录 - 请参阅this issue 了解更多信息。也许尝试最新版本,看看是否可以为您解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多