我目前正在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日志记录
由于
帕特里克答案 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。