2013-02-11 10 views
7

私はログ宝石を使用するロギングを行うためにルビー1.9.2p180(2011-02-18リビジョン30909)ルビー:ロガーとデーモン

を使用しています。 私のプログラムには2つのブロックがあり、デーモンとして使用されます。

しかし、エラーでこれらのブロックの結果からログインし、何もログファイルに書き込まれません。ここで

log shifting failed. closed stream 
log writing failed. closed stream 

は、コード内で何が起こるかです:

log = Logger.new(logbase + 'logfile.log', 'monthly') 
log.level = Logger::INFO 

proc = Daemons.call(options) do 
    # [...] 
    log.info "Any Logmessage" 
    # [...] 
end 

任意のアイデア、いただきました!間違って?

答えて

8

Daemons gemは、プロセスをデーモン化するときにすべてのファイル記述子を閉じます。したがって、Daemonsブロックの前に開かれたログファイルは、forkされたプロセスの内部で閉じられます。

そして、クローズドファイル記述子 - >エラーに書き込むことはできません。

あなたは章を読むことによって、プロセスをデーモン化したときに何が起こるかについての詳細を読むことができます:

は、デーモンが内部的に私のデーモンと何をしますか?
http://daemons.rubyforge.org/Daemons.html

溶液ではなく、それの外側のデーモンブロックの内部ログファイルを開くことです。それはそれを修正する必要があります。しかし、デーモン処理は作業ディレクトリを/に変更するので、ログファイルパスを参照する際に考慮してください。

+0

助けました。どうもありがとうございました。 – Dakkar

2

delayed_job gemで正常に動作するソリューションには、fork前にすべての開いているファイルを抽出し、後でそれらを再度開くことが含まれます。

調整エキスfrom delayed_job

@files_to_reopen = [] 
ObjectSpace.each_object(File) do |file| 
    @files_to_reopen << file unless file.closed? 
end 

Daemons.run_proc('some_process') do 
    @files_to_reopen.each do |file| 
    file.reopen file.path, 'a+' 
    file.sync = true 
    end 

    # Your code 
end