2

私は、delayed_jobs が本番環境で失敗するという奇妙な問題に苦しんでいます。最後に、ロガーに絞り込みました。ログ関数呼び出しをコメントアウトすると、すべてが機能します。ただし、ログに記録しようとすると、delayed_job ハンドラーで次のようになります。

 --- !ruby/struct:Delayed::PerformableMethod 
object: AR:User:1
method: :load_and_update_without_send_later
args: []

 | closed stream
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/opt/ruby/lib/ruby/1.8/logger.rb:496:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:326:in `add'
/opt/ruby/lib/ruby/1.8/logger.rb:374:in `info'
/home/rails/myapp.com/releases/20100203203031/app/models/gmail.rb:35:in `log'

私のロガーは次のようになります。

@@error_log_file = File.open("#{RAILS_ROOT}/log/error.log", 'a')
@@error_log_file.sync = true
def log(msg)
  msg.each do |line|
    line = "#{Time.now.strftime('%H:%M:%S')}  #{line}"
    @@error_log_file.info(line) # this is line 35 where it's failing
    puts line
  end
end

「@@error_log_file.sync = true」という行をコメントアウトすると、それも機能します。

これは遅延ジョブの問題ですか、それとも私のログ ディレクトリがシンボリック リンクであることに関連している可能性がありますか (標準の capistrano デプロイによるセットアップとして)?

また、error.log ファイルには何も書き込まれず、delayed_job.log にも何も書き込まれません。完全に困惑...

4

3 に答える 3

5

Woody Peterson はここで問題を発見しました: http://groups.google.com/group/delayed_job/browse_thread/thread/f7d0534bb6c7c83f/37b4e8ed7bfaba42

問題は:

DJ は本番環境で Rails のバッファリングされたログを使用しており、何らかの理由でバッファのフラッシュがトリガーされていません (バッファ サイズによってフラッシュされたのか、リクエスト後に明示的にフラッシュされたのかは不明です)。

一時的な修正 (Nathan Phelps の功績) は次のとおりです。

本番環境では、バッファリングされたログは auto_flushing 値 1000 に設定されます。これは、1000 件のメッセージが記録されるまでフラッシュが呼び出されないことを意味します。collectiveidea のdelayed_job のフォークを使用していると仮定すると、64 行目でロガーが初期化された直後に、command.rb で auto_flushing をより妥当な値に設定することでこれに対処できます。 IE

Delayed::Worker.logger = Rails.logger

Delayed::Worker.logger.auto_flushing = 1 # または何でも

私にとって完璧に機能します!

于 2010-02-11T20:02:37.817 に答える
0

同様の問題がありました。collectiveidea フォークのロギングが書き直されています。詳細については、この問題を参照してください。おそらく、最新バージョンを試して、問題が解決するかどうかを確認してください。

于 2010-02-04T19:49:27.643 に答える
0

閉じたファイルにログインしようとしているようです。おそらく、SyslogLogger gem を試すことを検討したことがありますか?

rails での使用方法に関する記事は、開始に役立つはずです。

于 2010-02-03T21:24:56.797 に答える