In Rails möchte ich einige Informationen in einer anderen Protokolldatei protokollieren und nicht im Standard-Entwicklungsprotokoll oder im Produktionsprotokoll. Ich möchte diese Protokollierung von einer Modellklasse aus durchführen.
quelle
In Rails möchte ich einige Informationen in einer anderen Protokolldatei protokollieren und nicht im Standard-Entwicklungsprotokoll oder im Produktionsprotokoll. Ich möchte diese Protokollierung von einer Modellklasse aus durchführen.
Sie können ein Logger-Objekt in jedem Modell selbst erstellen. Übergeben Sie einfach den Dateinamen an den Konstruktor und verwenden Sie das Objekt wie die üblichen Rails logger
:
class User < ActiveRecord::Base
def my_logger
@@my_logger ||= Logger.new("#{Rails.root}/log/my.log")
end
def before_save
my_logger.info("Creating user with name #{self.name}")
end
end
Hier habe ich ein Klassenattribut verwendet, um den Logger auswendig zu lernen. Auf diese Weise wird es nicht für jedes einzelne Benutzerobjekt erstellt, das erstellt wird, aber Sie müssen dies nicht tun. Denken Sie auch daran, dass Sie die my_logger
Methode direkt in die ActiveRecord::Base
Klasse (oder in eine eigene Superklasse, wenn Sie nicht zu viel Affen-Patches möchten) einfügen können, um den Code zwischen den Modellen Ihrer App zu teilen.
User.logger = Logger.new(STDOUT)
oder wo immer Sie sich anmelden möchten. Auf die gleiche WeiseActiveRecord::Base.logger = Logger.new(STDOUT)
wird die gesamte Protokollierung für alle Modelle geändert.User.logger = Logger.new(STDOUT)
Die gesamte Protokollierung für alle Modelle wurde geändert. Nun, es hat sich geändertActiveRecord::Base.logger
my_logger
inapplication_controller.rb
.Aktualisieren
Ich habe ein Juwel basierend auf der folgenden Lösung namens multi_logger erstellt . Tun Sie dies einfach im Initialisierer:
und Ruf an
und du bist fertig.
Wenn Sie es selbst codieren möchten, siehe unten:
Eine vollständigere Lösung wäre, Folgendes in Ihr
lib/
oderconfig/initializers/
Verzeichnis zu legen .Der Vorteil besteht darin, dass Sie den Formatierer so einrichten können, dass Zeitstempel oder Schweregrade automatisch in die Protokolle eingefügt werden. Dies ist von überall in Rails zugänglich und sieht mithilfe des Singleton-Musters besser aus.
quelle
#{$$}
?Eine anständige Option, die für mich funktioniert, besteht darin, Ihrem
app/models
Ordner eine ziemlich einfache Klasse hinzuzufügen, zapp/models/my_log.rb
dann in Ihrem Controller oder wirklich fast überall dort, wo Sie in Ihrer Rails-App auf die Klasse eines Modells verweisen können, dh überall dort, wo Sie dies tun können
Post.create(:title => "Hello world", :contents => "Lorum ipsum");
oder ähnliches, können Sie sich in Ihrer benutzerdefinierten Datei wie dieser anmeldenquelle
Definieren Sie eine Logger-Klasse in (sagen wir) app / models / special_log.rb:
Initialisieren Sie den Logger in (sagen wir) config / initializers / special_log.rb:
Überall in Ihrer App können Sie sich anmelden mit:
quelle
Hier ist mein benutzerdefinierter Logger:
quelle
quelle
Ich würde vorschlagen, Log4r gem für die benutzerdefinierte Protokollierung zu verwenden. Zitat Beschreibung von seiner Seite:
quelle
quelle
Das Logging-Framework mit seinem täuschend einfachen Namen hat die Raffinesse, nach der Sie sich sehnen!
Befolgen Sie die sehr kurzen Anweisungen von Logging-Rails , um Rauschen herauszufiltern, Warnungen zu erhalten und die Ausgabe feinkörnig und auf hoher Ebene auszuwählen.
Klopfen Sie sich auf den Rücken, wenn Sie fertig sind. Täglich Holzrollen. Allein dafür lohnt es sich.
quelle