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

haj
 2022-08-07 01:14
#194441 #194441
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Autsch. Sorry. Ich habe das einfach irgendwo abgeschrieben und nicht getestet.

Wenn man genau hinschaut - oder es mit use warnings; laufen läßt - dann wird's klar: mit local *STDERR ist der Wert von *STDERR erstmal undef. Da kann man nichts hinprinten (-w sagt: print() on unopened filehandle STDERR).

So geht's (in der Klasse wird das originale STDERR dupliziert):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use strict;
use warnings;
package TeeStdErr;
use Fcntl qw(:flock);

my $log_file = "$ENV{DOCUMENT_ROOT}/state/err.log";
open (my $orig_stderr, '>&', \*STDERR);

sub TIEHANDLE { my $i; bless \$i, shift } 

sub PRINT {
        my $r = shift;

        print $orig_stderr @_; 

        if ( open my $FH, '>>', $log_file ) { 
                flock $FH, LOCK_EX;
                print $FH "" . localtime, "\t", "ErrorLog: ", @_; 
                close $FH;
        }
        else {
                warn "Open $log_file '$!'", @_; 
        }
}

package main;
        
$| = 1; 

# Tee für STDERR
tie *STDERR, "TeeStdErr";
print STDERR "print STDERR\n";
warn "warn";

Last edited: 2022-08-07 14:08:18 +0200 (CEST)

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