5

我目前正在用 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 日志记录

谢谢

帕特里克

4

3 回答 3

4

延迟作业使用了守护进程和活动记录,在守护进程之前,获取文件已打开,然后在守护进程中重新打开

@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
于 2010-11-22T14:04:01.287 回答
4

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

于 2010-04-06T14:12:55.293 回答
2

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

于 2009-11-10T22:22:48.880 回答