我正在使用ruby 1.9.2p180(2011-02-18修订版30909)
为了进行日志记录,我使用了日志记录宝石。 我的程序有两个块,用作守护进程。
但是从这些块进行日志记录会导致错误,并且没有任何内容写入日志文件:
log shifting failed. closed stream
log writing failed. closed stream
以下是代码中发生的事情:
log = Logger.new(logbase + 'logfile.log', 'monthly')
log.level = Logger::INFO
proc = Daemons.call(options) do
# [...]
log.info "Any Logmessage"
# [...]
end
任何想法,那里有什么不对吗?
答案 0 :(得分:9)
Daemons
gem在守护进程时关闭所有文件描述符。因此,在守护程序块之前打开的任何日志文件都将在分叉进程内关闭。
由于您无法写入已关闭的文件描述符 - >错误。
通过阅读章节,您可以阅读更多关于守护程序时会发生什么的事情:
守护进程内部对我的守护进程做了什么?
http://daemons.rubyforge.org/Daemons.html
解决方案是在守护程序块内部而不是在其外部打开日志文件。那应该解决它。但请注意,守护进程会将工作目录更改为/
,因此在引用日志文件路径时请将其考虑在内。
答案 1 :(得分:2)
在delayed_job gem中成功运行的解决方案包括在fork之前提取所有打开的文件,并在以后重新打开它们。
调整后的摘录from delayed_job:
@files_to_reopen = []
ObjectSpace.each_object(File) do |file|
@files_to_reopen << file unless file.closed?
end
Daemons.run_proc('some_process') do
@files_to_reopen.each do |file|
file.reopen file.path, 'a+'
file.sync = true
end
# Your code
end