STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

05/09/2007 - 18:01 von Torsten Mohr | Report spam
Hallo,

ich starte von einem Perlskript aus ein Programm, dessen
Ausgaben auf STDOUT und auf STDERR ich mitloggen möchte.

Dabei kommte es mir auf die zeitliche Abfolge an, die soll
durch Buffering usw. nicht durcheinander kommen.

Wenn das Programm (als Beispiel mal ein Perlskript) das ich
mitlogge so aussieht:

print STDERR "ABC";
print "DEF";
print STDERR "GHI";
print "JKL";

Dann möchte ich diese Reihenfolge so auch mitloggen.

Ich versuche das momentan so:

#! /usr/bin/perl -w

open STDERR, "| perl log_err.pl" or die "no";
select STDERR;
$| = 1;
open STDOUT, "| perl log_out.pl" or die "no 2";
select STDERR;
$| = 1;

system "perl kandidat.pl";


Die Reihenfolge der Eintràge ist damit leider nicht mehr korrekt,
ich bekomme ABC, GHI, DEF, JKL.


Kann ich das irgendwie so mitloggen daß die Reihenfolge richtig
mitgeloggt bleibt?


Grüße,
Torsten.
 

Lesen sie die antworten

#1 mlelstv
05/09/2007 - 23:26 | Warnen spam
Torsten Mohr writes:

Ich versuche das momentan so:

#! /usr/bin/perl -w

open STDERR, "| perl log_err.pl" or die "no";
select STDERR;
$| = 1;
open STDOUT, "| perl log_out.pl" or die "no 2";
select STDERR;
$| = 1;

system "perl kandidat.pl";




Die Pufferung wird im Programm (in der libc) selbst vorgenommen
und gilt damit nicht fuer andere Programme, die daraus aufgerufen
werden. Du musst also die '$|=1;' in kandidat.pl einbauen, damit
eben dieses Script selbst nicht mehr puffert.

N.B.

use FileHandle;
STDOUT->autoflush(1);
STDERR->autoflush(1);

ist huebscher.

Die Alternative ist, beide Ausgaben auf ein Filehandle zu legen.
Also sowas wie:

open STDERR,">&STDOUT";

Das uebertraegt sich auch auf aufgerufene Programme. Die Ausgaben
landen damit natuerlich nur auf stdout und lassen sich nicht mehr
trennen.


Michael van Elst
Internet:
"A potential Snark may lurk in every tree."

Ähnliche fragen