2009-07-24 6 views
3

In meiner Rails-Anwendung habe ich einen Hintergrundprozess-Runner, Modellname Worker, der nach neuen Aufgaben sucht, die alle 10 Sekunden ausgeführt werden. Diese Prüfung generiert jedes Mal zwei SQL-Abfragen - eine Suche nach neuen Jobs, eine zum Löschen alter abgeschlossener Jobs.Modellspezifische SQL-Protokollierung in Schienen

Das Problem damit - die Hauptprotokolldatei erhält Spam für jede dieser Abfragen.

Kann ich die SQL-Abfragen, die vom Worker-Modell erzeugt wurden, in eine separate Protokolldatei leiten oder sie zumindest zum Schweigen bringen? Das Überschreiben von Worker.logger funktioniert nicht - es leitet nur die Nachrichten um, die explizit logger.debug ("etwas") aufrufen.

Antwort

4

Die einfachste und idiomatische Lösung

logger.silence do 
    do_something 
end 

Siehe Logger#silence

+0

Ended up dies zu tun. Nicht, was ich mir erhofft hatte, aber es löst das Problem. –

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 

Dies ist ein ziemlich vertraut Idiom. Ich habe es oft in verschiedenen Situationen gesehen. Natürlich, wenn Sie nicht gewusst hätten, dass ActiveRecord :: Base.logger so geändert werden kann, wäre es schwer zu erraten gewesen.

Ein Nachteil dieser Lösung: Dies ändert die Logger-Ebene für alle ActiveRecord, ActionController, ActionView, ActionMailer und ActiveResource. Dies liegt daran, dass eine einzige Logger-Instanz von allen Modulen gemeinsam genutzt wird.