Ich muss wirklich etwas offensichtlich übersehen haben, aber ich habe Probleme mit der allgemeinen Verwendung von Log4r in meiner Ruby-Anwendung. Ich bin in der Lage, ohne Problem zu protokollieren, aber der Overhead scheint klobig, wie ich es eingerichtet habe. Ich gebe im Grunde den vollständigen Pfad zu einem Dateinamen, um jede Klasse in meiner Anwendung einzuloggen. Das Ruby-Skript, das aufgerufen wird, zieht die Protokolldatei aus einem der Argumente in ARGV, die dann in jeder Klasse, die ich in Ruby anrufe, übergeben und gesetzt werden. In jeder Klasse verwende ich den MusterFormatter, um den Klassen- / Dateinamen in die Protokollanweisung einzufügen.
Gibt es einen besseren Weg, dies zum Funktionieren zu bringen? Es fühlt sich an, als ob etwas, woran ich denke, etwas erfordert, das in meiner Rubin-Anwendung an jede Klasse weitergegeben wird. Ich könnte stattdessen die Protokolldatei in einer YAML-Konfigurationsdatei festlegen, aber dann würde ich auch die Konfigurationsdatei an jede Klasse weitergeben.
Irgendwelche Tipps? Wenn das keinen Sinn ergibt, könnte ich versuchen, einige spezifischere Codebeispiele zu posten, um zu erklären, was ich meine.
Danke!
Hmm, irgendeinen Grund, warum Sie Log4r::Logger
class nicht am Anfang Ihres Skripts instanziieren und die Instanz herumreichen? Sie müssen es nicht einmal weitergeben, Sie können es immer mit Namen von Logger
class:
run.rb:
%Vor%class_a.rb:
%Vor% und wenn Sie run.rb
ausführen, erhalten Sie:
und eine Protokolldatei mit dem Namen logtest.log
auf der Festplatte.
Ich bin der Betreuer von log4r,
Für einzelne Scripts (verschiedene .rb-Dateien) könnte man dies auf verschiedene Arten angehen (passend, ich weiß), zunächst darauf achten, dass die Features, die ich hier behandle, in & gt; = 1.1.4 verfügbar sind .
Eine Möglichkeit wäre, eine andere PatternFormatter-Zeichenfolge pro Skript festzulegen (wenn Sie eine yaml- oder xml-Konfigurationsdatei erstellen, können Sie verschiedene Muster auf Klassenbasis angeben).
Ein anderer Weg wäre die Verwendung von GDC, NDC oder MDC in einem PatternFormatter.
GDC setzt einen "globalen Diagnosekontext", dh, es ist ein Wert, der von allen Threads verfügbar ist, die ein Skript ausführen. Sie können es verwenden, indem Sie% g in das Muster einfügen und den Wert über GDC.set (String) für detailliertere Informationen festlegen, siehe: Ссылка
NDC und MDC sind verschachtelte bzw. zugeordnete Diagnosekontexte. Das Muster dafür ist,% X und% X {Symbol | Objekt} zu verwenden und sie über NDC.set (String) und MDC.put (Symbol | Object, Object)
zu setzenNoch ein anderer Weg wäre, das Pattern% t zu verwenden, das den Dateinamen und die Zeilennummer des Anruforts ausgibt.
Der Kompromiss zwischen diesen Methoden besteht darin, dass sie bei der CPU-Ressourcennutzung immer teurer werden. Ich neige dazu, zuerst GDC für die Art von Dingen zu verwenden, nach denen Sie fragen.