7

我正在使用 ruby​​ 1.9.2p180(2011-02-18 修订版 30909)

为了进行日志记录,我使用日志记录 gem。我的程序有两个块,用作守护进程。

但是从这些块中记录会导致错误,并且不会将任何内容写入日志文件:

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

任何想法,那里有什么问题?

4

2 回答 2

9

gem在Daemons守护进程时关闭所有文件描述符。因此,在守护进程块之前打开的任何日志文件都将在分叉进程中关闭。

而且由于您无法写入已关闭的文件描述符->错误。

您可以通过阅读以下章节了解更多关于守护进程时会发生什么的信息:

守护进程在内部对我的守护进程做了什么?
http://daemons.rubyforge.org/Daemons.html

解决方案是在守护程序块内而不是在其外部打开日志文件。那应该解决它。但请注意,守护进程会将工作目录更改为/,因此在引用日志文件路径时要考虑到这一点。

于 2013-02-11T08:36:26.310 回答
2

在 delay_job gem 中成功运行的解决方案包括在 fork 之前提取所有打开的文件,然后再重新打开它们。

来自延迟作业的调整提取:

@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
于 2015-04-23T13:28:09.833 回答