Ruby:Logger和Daemons

时间:2013-02-11 08:17:29

标签: ruby logging daemons

我正在使用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

任何想法,那里有什么不对吗?

2 个答案:

答案 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