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?
Wenn Sie den Logger selbst erstellen, können Sie zuerst das Objekt File
erstellen und dann den Logger erstellen und ihn $stderr
zuweisen:
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:
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.