2009-11-10 3 views
5

Я пишу проект в настоящий момент в Ruby, который использует камень ActiveRecord для взаимодействия с базой данных, и я пытаюсь зарегистрировать всю активность базы данных с помощью атрибута ActiveRecord::Base.logger со следующим кодомRuby Daemons, вызывающие LogRecord Logger IOError

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 рубок в более потокобезопасного образе

Thanks

Патрика

ответ

1

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

+0

Будет ли проблема проистекает из синхронизации? Не могли бы вы использовать Rails BufferedLogger и посмотреть, устранила ли это проблему? –

+0

Мы закончили тем, что написали простое приложение регистрации для наших нужд, используя DRB, который обрабатывал ошибки для всех наших потоков. –

4

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

+0

Не могли бы вы объяснить, что вы подразумеваете под «daemonize и затем загружать Rails env» –

+0

Daemons.run_proc ('your_daemon', daemon_options) {require File.expand_path (File.join (File.dirname (__ FILE__), '..', 'config', 'environment')) # do stuff} –

+0

@LoganKoester Обратите внимание, что попытка получить информацию о dir на '__FILE__' не будет работа после того, как вы демонизировали, так как этот процесс теряет эту информацию. Вам нужно будет сохранить этот путь до демонализации. – Kelvin

4

delayed_job использовал демон и ActiveRecord, перед демоном, получить файлы открытой компании, а затем снова в демоне

@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 
+1

Они делают что-то подобное в lib/delayed/command.rb – m33lky

+0

Не забудьте добавить разрешение на запись. 'file.reopen file.path," a "' – Phil