2009-11-10 32 views
5

我寫在紅寶石的那一刻它利用ActiveRecord的寶石的數據庫交互的項目,我想使用ActiveRecord::Base.logger屬性用下面的代碼紅寶石守護進程造成的ActiveRecord記錄儀IO錯誤

記錄所有數據庫活動
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記錄

感謝

帕特里克

回答

1

的其他途徑事實證明,對於遷移工作ActiveRecord::Base.logger變量不能爲零,這解釋了上半年的問題。儘管當使用文件而不是STDERR時,我仍然無法修復IOError。

+0

重新請問這個問題從莖同步?你可以使用Rails的BufferedLogger來看看是否解決了這個問題? –

+0

我們結束了寫使用DRB我們的需求,它處理的錯誤對我們的所有線程 –

4

我碰到了同樣的問題。首先需要守護進程,然後然後加載Rails環境。

+0

一個簡單的記錄應用程序,你能解釋一下你的意思是什麼「守護進程,然後裝入滑軌ENV」 –

+0

Daemons.run_proc(「your_daemon」,DAEMON_OPTIONS){要求File.expand_path(File.join(File.dirname(__ FILE__), '..', '配置', '環境'))#做的東西} –

+0

@LoganKoester注意,試圖讓'__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 /延遲的東西/ command.rb – m33lky

+0

不要忘記添加一個寫權限。 'file.reopen file.path,「a」' – Phil