Gibt es eine Möglichkeit, Log :: Log4perl zu verwenden, um ein intelligentes Protokollierungsmodul zu erstellen, das protokolliert seine Operationen an eine Datei, auch wenn das aufrufende Skript Log4perl nicht initialisiert? Soweit ich das anhand der Dokumentation feststellen kann, besteht die einzige Möglichkeit, Log4perl aus einer Konfiguration im laufenden Skript zu initialisieren, darin, dass Module, die Log4perl-Aufrufe implementieren, sich selbst anhand der Log4perl-Konfiguration des Aufrufers anmelden.
Stattdessen möchte ich, dass die Module eine Standardinitialisierungskonfiguration für Log4perl bereitstellen. Dies würde den Standard-Dateiappender für die Modulkategorie bereitstellen. Dann könnte ich dieses Verhalten außer Kraft setzen, indem ich Log4perl im Aufrufer mit einer anderen Konfiguration bei Bedarf einfüge, und alles würde hoffentlich funktionieren.
Ist diese Art von defensivem Protokollierungsverhalten möglich oder muss ich Log4perl in jedes .pl-Skript einfügen, das das Modul aufruft, das ich protokollieren möchte?
Ich mache das in einer benutzerdefinierten Log-Rolle in Elch (irrelevanter komplizierter Code wurde entfernt):
%Vor% Wie Sie sehen können, initialisiert sich das Log-Objekt selbst - wenn Log::Log4perl->init
nicht aufgerufen wurde, wird easy_init
aufgerufen. Sie könnten dies leicht ändern, damit jedes Modul seinen Logger anpassen kann - ich mache das mit optionalen Rollenparametern, mit ref($this)
als Standardfallback.
PS. Vielleicht möchten Sie sich auch MooseX :: Log :: Log4perl anschauen, wo ich angefangen habe bevor ich die oben erwähnte Logger-Rolle benutzt habe. Eines Tages, wenn ich dazu komme, werde ich einige dringend benötigte Patches an dieses MX-Modul senden, um einige Funktionen hinzuzufügen, die ich hinzugefügt habe.
Die kurze Antwort lautet: Log :: Log4perl :: initialized (); irgendwann und wenn es falsch ist, richten Sie eine Standardprotokollierung ein.
Der heikle Teil ist "Irgendwann".
Sie können es nicht in BEGIN {} tun, weil dann das Hauptskript Ihre Initialisierung stampft, obwohl Sie unwichtige Dateien erstellt haben. Sie möchten es nicht vor jedem Aufruf von get_logger () tun, weil das verschwenderisch ist. Also sollten Sie es während der Initialisierung des Moduls tun, sagen wir sub new oder sub init.