2009-07-24 6 views
3

私のレールアプリケーションでは、新しいタスクが10秒ごとに実行されることを確認するバックグラウンドプロセスランナーのモデル名Workerがあります。このチェックでは、毎回2つのSQLクエリが生成されます.1つは新しいジョブを検索し、もう1つは古い検索クエリを削除します。レールにモデル固有のSQLログイン

この問題は、メインログファイルがこれらのクエリごとにスパムを受けます。

Workerモデルによって作成されたSQLクエリを個別のログファイルに書き込むことができます。 Worker.loggerを上書きすると、logger.debug( "something")を明示的に呼び出すメッセージだけがリダイレクトされます。

答えて

4

最も簡単で慣用ソリューション

logger.silence do 
    do_something 
end 

Logger#silence

+0

がこれをやってしまっ参照してください。私が望んでいたものではありませんが、問題を解決します。 –

0
class Worker < ActiveRecord::Base 
    def run 
    old_level, self.class.logger.level = self.class.logger.level, Logger::WARN 

    run_outstanding_jobs 
    remove_obsolete_jobs 
    ensure 
    self.class.logger.level = old_level 
    end 
end 

これはかなりよく知られているイディオムです。私はさまざまな状況で何度もそれを見てきました。もちろん、ActiveRecord :: Base.loggerがそのように変更できることを知らなかったら、推測するのは難しいでしょう。

これは、ActiveRecord、ActionController、ActionView、ActionMailer、およびActiveResourceのすべてについて、ロガーレベルを変更します。これは、すべてのモジュールで共有される単一のLoggerインスタンスが存在するためです。

関連する問題