Log4perl: Wie lade ich Appender zur Laufzeit dynamisch?

8

Ich möchte, dass Module ihre Protokollierung zur Laufzeit verwalten, ohne dass sich alles auf eine einzige monolithische Konfigurationsdatei bezieht. Wenn ich mit Prozessen arbeite, die unter verschiedenen Berechtigungen laufen, möchte ich wirklich nicht jeden Prozess behandeln, der auf jedes Protokoll im System zugreifen muss, wenn er nur auf eine Untergruppe von ihnen schreibt.

Allerdings finde ich im Log4perl-Handbuch nicht viel Dokumentation darüber, wie man zusätzliche Appender zur Laufzeit aus einer Konfigurationsdatei initialisiert. Ссылка verweist auf eine add_appender-Methode, die aber auf instanziierten appender-Objekten statt auf conf-Dateien funktioniert. Es definiert auch nicht die Logger-Objekte und die Logger- & gt; Appender-Relationen.

Ich habe versucht, jedes Paket von seinem eigenen conf zu initialisieren, aber das überschneidet sich bei jeder Initialisierung einfach mit der bestehenden Konfiguration. Was ich gerne tun würde, ist etwas in der Art von:

%Vor%

Wie kann ich die Konfiguration analysieren und in die aktuelle Konfiguration einfügen?

Edit: Probalem mit der Verwendung einer Paketvariablen ist, dass dies nur eine Moose-Rolle ist, die von verschiedenen Klassen verbraucht wird, ziemlich genau eine MooseX :: Role :: Parametrisierte Version von Ethers Antwort in Making-Module mit Log :: Log4perl . Daher wird mein Logger in die Bibliothek umgewandelt, die ihn verbraucht, und ich habe keine globale Variable, an der ich jedes Mal arbeiten kann, wenn ich sie benutze.

Obwohl ..

Wenn ich eine globale Variable außerhalb des Rollenblocks MooseX :: Role :: Parameterized deklariere, würde jede Klasse, die die Rolle konsumiert, dieselbe conf-Variable verwenden?

    
Oesor 17.01.2011, 17:18
quelle

2 Antworten

5

Sie können sich erinnern, welche Konfigurationsdateien bereits geladen wurden ( %log_configs hash im folgenden Code). Wenn eine neue Klasse eintrifft, können Sie alle Konfigurationen erneut einlesen, zusammenführen und% ce_de% erneut initialisieren, indem Sie den String-Referenzparameter auf Log::Log4perl anwenden.

Im Allgemeinen bevorzuge ich eine einzige Protokollkonfiguration pro Anwendung, da die Wartung und das Neuladen einfacher ist.

%Vor%     
bvr 21.01.2011 09:57
quelle
5

Während ich gehofft habe, es zu vermeiden, kann ich, wenn ich die Konfigurationsdateien selbst parse, auf die Konfiguration in Perl über die API zugreifen, die in Ссылка . Nämlich,

%Vor%

Während die andere Methode funktioniert, gibt es zu viele Vorbehalte, damit ich mich damit wohl fühlen kann (Gee, ich habe diese Bibliothek benutzt, warum ist mein Logging gestoppt worden?) - es ist einfach zu überraschend für meinen Geschmack.

Stattdessen werde ich herausfinden, ob ich nicht von der Konfigurationsdatei in den Log :: Log4perl-Zustand gelangen kann, indem ich mir durchschaue, wie man Log :: Log4perl :: Config :: PropertyConfigurator , an die delegiert wird - & gt; init, wenn das Parsen einer Konfigurationsdatei erforderlich ist. Wenn ich die Datenstruktur überspringe, die zurückkehrt, kann ich Änderungen der Initialisierung auf einer Logger-für-Logger- und Appender-für-Appender-Basis vergleichen und den initialisierten Zustand entsprechend modifizieren, Namespace-Kollisionen richtig behandeln, etc.

    
Oesor 25.01.2011 15:09
quelle

Tags und Links