Thread Ausgabe auf STDERR und Datei gleichzeitig (quasi wie tee) (14 answers)
Opened by GwenDragon at 2022-08-03 16:01

haj
 2022-08-03 23:48
#194428 #194428
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Das ist schon nicht ganz so einfach....

Die drunterliegende Infrastruktur (C-Bibliotheken) gibt's nicht her, mit einem print in zwei Dateien zu schreiben. Eine Umleitung der Ausgabe passiert ja auch nicht im Programm selbst, sondern in der Shell, die das Programm aufruft. "Irgendwer" muss also die zwei print-Aufrufe an die zwei Filehandles explizit nacheinander absetzen.

Wenn Du sowohl warn als auch direktes print STDERR abfangen willst, dann hilft Dir %SIG{__WARN__} auch nicht weiter.

Beim Apache kann man die Log-Inhalte auch an einen Prozess schicken, der Prozess könnte dann die zwei Dateien befüllen. Das ist die normale Methode, um logrotate mit Apache zu verwenden - aber das ist dann doch wieder eine Pipe.

Wenn alles innerhalb eines Prozesses passierem soll, dann hätte ich zwei Ideem;
  • CPAN:Capture::Tiny hat eine Methode tee_stderr. Damit bekommst Du alles, was nach STDERR geht, zusätzlich in eine Variable, musst die aber immer noch zu einem geeigneten Zeitpunkt in Deine Logdatei schreiben. Das mit dem "geeigneten Zeitpunkt" kann bei einem persistenten Perl-Interpreter etwas schwierig werden.
  • Mit Perldoc:perltie kannst Du den Handle STDERR in eine Klasse "umlenken", dazu gibt es einen eigenen Abschnitt in der Beschreibung. Da schreibst Du dann eine PRINT-Methode etwa in der Art:
    Code (perl): (dl )
    1
    2
    3
    4
    5
    6
    
    sub PRINT {
        my $self = shift;
        local STDERR; untie STDERR;
        print STDERR @_;
        print $my_log_file @_;
    }

View full thread Ausgabe auf STDERR und Datei gleichzeitig (quasi wie tee)