Ruby Daemons вызывает ActiveRecord logger IOError - PullRequest
5 голосов
/ 11 ноября 2009

Я сейчас пишу проект на Ruby, который использует гем ActiveRecord для взаимодействия с базой данных, и я пытаюсь регистрировать всю активность базы данных, используя атрибут 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 ]

4 голосов
/ 06 апреля 2010

Я столкнулся с той же проблемой. Сначала необходимо выполнить демонизацию, а , а затем загрузить среду Rails.

4 голосов
/ 22 ноября 2010

delayed_job использовал демонов и activerecord, перед демонизацией получите файлы 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 голосов
/ 11 ноября 2009

Оказывается, что для работы миграций переменная ActiveRecord::Base.logger не может быть nil, что объясняет первую половину проблемы. Я пока не могу исправить IOError, хотя, когда файл используется вместо STDERR.

...