【问题标题】:Ruby: Logger and DaemonsRuby:记录器和守护进程
【发布时间】:2013-01-26 07:46:00
【问题描述】:

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

任何想法,有什么问题?

【问题讨论】:

    标签: ruby logging daemons


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这有帮助。非常感谢。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 2011-10-04
      • 2012-09-05
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多