Ruby守护程序导致ActiveRecord记录器IOError

时间:2009-11-10 22:11:28

标签: ruby activerecord daemons ioerror

我目前正在Ruby中编写一个项目,它利用ActiveRecord gem进行数据库交互,并且我尝试使用ActiveRecord::Base.logger属性使用以下代码记录所有数据库活动

ActiveRecord::Base.logger = Logger.new(File.open('logs/database.log', 'a'))

这适用于迁移等(由于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时失败并出现以下错误

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/logger.rb:504:in `write': closed stream (IOError)

如何解决这个问题的任何想法将不胜感激。目前我已经开始查看其他代码,看看人们是否有其他方式以更加线程安全的方式实现ActiveRecord日志记录

由于

帕特里克

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。您需要首先进行守护,然后然后加载Rails环境。

答案 1 :(得分:4)

delayed_job使用了守护进程和activerecord, 在daemonize之前,让文件有opend,然后在daemonize中重新打开

@files_to_reopen = []
ObjectSpace.each_object(File) do |file|
  @files_to_reopen << file unless file.closed?
end

Daemons.run_proc("xxxxx_name",:dir=>pid_file,:dir_mode=>:normal) do
  Dir.chdir(Rails.root)
  # Re-open file handles
  @files_to_reopen.each do |file|
    begin
      file.reopen file.path
      file.sync = true
    rescue ::Exception
    end
  end
end

答案 2 :(得分:2)

事实证明,对于迁移工作,ActiveRecord::Base.logger变量不能为零,这解释了问题的前半部分。当使用文件而不是STDERR时,我仍然无法修复IOError。