2009-07-24 2 views
3

레일 어플리케이션에서 10 초마다 실행되는 새 작업을 확인하는 백그라운드 프로세스 러너, 모델 이름 Worker가 있습니다. 이 검사는 매번 두 개의 SQL 조회를 생성합니다. 하나는 새 작업을 찾고, 하나는 완료된 기존 작업을 삭제합니다.모델 별 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가 이와 같이 변경 될 수 있다는 것을 모르는 경우 추측하기 어려울 것입니다. 이 솔루션의

한 가지주의 :이 액티브, ActionController, ActionView, ActionMailer 및 ActiveResource의 모든 로거 수준 을 변경합니다. 이것은 모든 모듈이 공유하는 단일 Logger 인스턴스가 있기 때문입니다.