Studer zu Logger-Instanz umleiten

8

Ich habe eine Logger Instanz:

%Vor%

Ich möchte auch Laufzeitfehler (stderr output) in das Log umleiten. Ich habe diesen Forum-Thread gefunden, der den folgenden Ratschlag enthält:

%Vor%

Logger verfügt jedoch weder über eine Instanzmethode get_logger_file_descriptor , noch kann ich offengelegte Methoden zum Zugriff auf das Protokollgerät oder die Protokolldatei finden.

Wie kann ich bewirken, dass die gesamte $ stderr-Ausgabe in das Protokoll aufgenommen wird?

    
Phrogz 09.03.2012, 15:58
quelle

2 Antworten

15

Wenn Sie den Logger selbst erstellen, können Sie zuerst das Objekt File erstellen und dann den Logger erstellen und ihn $stderr zuweisen:

%Vor%

Beachten Sie, dass dies dazu führt, dass die Protokollausgabe mit der Ausgabe von $stderr verwechselt wird, was zu Problemen führen kann, wenn Sie die Protokolldatei in einem bestimmten Format analysieren (dies wird mit Ihrer Lösung passieren) auch).

Wenn Sie nicht die zugrunde liegende Datei haben, sondern nur die logger von woanders erhalten, ist es ein wenig komplizierter. Was benötigt wird, ist ein IO like-Objekt, das $stderr zugewiesen werden kann und alles, was darauf geschrieben wird, an den Logger weiterleitet. Die Klasse IO in Ruby ist leider ziemlich eng mit dem zugrunde liegenden I / O-System (Dateideskriptoren und dergleichen) verbunden, und es gibt keine allgemeine Schnittstelle, die zum Erstellen von Eingabe- und Ausgabeströmen verwendet werden kann. ( StringIO ist die bemerkenswerte Ausnahme).

Allerdings gehen die meisten, wenn nicht alle Ausgabemethoden in IO letztendlich durch #write , sodass Sie durch Überschreiben dieser einen Methode genau das erreichen können, wonach Sie suchen:

%Vor%

Nun wird alles, was in $stderr geschrieben wurde, in die Protokolldatei geschrieben. Die Formatierung wird jedoch ein bisschen seltsam sein. Jedes Mal, wenn eine der Schreibmethoden #write aufruft, wird ein neuer Eintrag in der Logdatei gemacht. Zum Beispiel ruft #puts , das mit einem Array aufgerufen wird, #write für jeden Eintrag des Arrays auf und wieder mit einem Newline-Zeichen zwischen jedem Eintrag, was zu 2n - 1 Log-Einträgen führt, von denen n - 1 leer ist / p>

Sie könnten die überschriebene Methode #write komplizierter machen, um dies zu umgehen, vielleicht mit einem internen Puffer, und den Logger nur dann aufrufen, wenn Sie glauben, Sie hätten eine vollständige Nachricht. Alternativ können Sie die einzelnen Methoden überschreiben, um selbst in den Logger zu schreiben. Wenn Sie das getan hätten, müsste die Klasse IOToLog nicht unbedingt von IO erben.

Ihre beste Lösung hängt davon ab, wie die Standardfehlerausgabe in der Protokolldatei angezeigt werden soll, wie Ihr Programm $stderr verwendet und wie viel Arbeit Sie mit der Implementierung von Methoden aus IO erledigen möchten.

    
matt 09.03.2012, 22:56
quelle
2

Das Beste, was ich mir ausgedacht habe, ist dieser Umgehungs-Hack:

%Vor%

Es funktioniert, aber natürlich bricht die Verkapselung von Logger, von dem ich vermute, dass es aus einem bestimmten Grund da war.

    
Phrogz 09.03.2012 16:01
quelle

Tags und Links