我遇到了一些奇怪的问题,我的delayed_jobs在生产中失败了。最后,我把它缩小到记录器。如果我注释掉我的日志函数调用,一切正常。但是,如果我尝试记录,我会在delayed_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。完全难过......
答案 0 :(得分:5)
伍迪彼得森在这里发现了问题:http://groups.google.com/group/delayed_job/browse_thread/thread/f7d0534bb6c7c83f/37b4e8ed7bfaba42
问题是:
DJ正在使用Rails的缓冲日志生成,并且由于某种原因没有触发刷新缓冲区(不知道它是否被缓冲区大小刷新或者在请求后显式刷新)。
临时修复(归功于Nathan Phelps)是:
在生产中,缓冲日志设置为auto_flushing值1000,这意味着在记录1000条消息之前不会调用flush。假设您正在使用collectiveidea的delayed_job分支,您可以通过在第64行初始化记录器后立即在command.rb中将auto_flushing设置为更合理的值来解决此问题.I。E。
延迟:: Worker.logger = Rails.logger
延迟:: Worker.logger.auto_flushing = 1#或其他
完美适合我!
答案 1 :(得分:0)
看起来您正在尝试登录已关闭的文件。您是否考虑过尝试使用SyslogLogger gem?
这是an article on how to use it with rails,它可以帮助您入门。
答案 2 :(得分:0)
我遇到了类似的问题。正在重写collectiveidea fork中的日志记录 - 有关详细信息,请参阅this issue。也许尝试最新版本,看看是否能为您修复它。