STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

am 05.09.2007 18:01:28 von Torsten Mohr

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\n";
print "DEF\n";
print STDERR "GHI\n";
print "JKL\n";

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.

Re: STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

am 05.09.2007 23:26:55 von mlelstv

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: mlelstv@serpens.de
"A potential Snark may lurk in every tree."

Re: STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

am 05.09.2007 23:57:32 von Torsten Mohr

Hallo,

>>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.

Danke für die Erklärung. "kandidat.pl" ist nur ein Beispiel,
es ist ein Platzhalter, es steht für ein Programm auf das
ich keinen Einfluß habe.

Es wäre z.B. auch möglich das STDERR in ein anderes Programm
umzuleiten und dort die Ausgaben an STDERR mit speziellen
Sequenzen zu markieren und an STDOUT weiterzuleiten.
Wenn die Reihenfolge gleich bliebe wäre das ok.


Grüße,
Torsten.

Re: STDERR und STDOUT mitloggen, zeitliche Abfolge korrekt mitloggen

am 07.09.2007 18:21:30 von hjp-usenet2

On 2007-09-05 21:57, Torsten Mohr wrote:
>>>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.
>
> Danke für die Erklärung. "kandidat.pl" ist nur ein Beispiel,
> es ist ein Platzhalter, es steht für ein Programm auf das
> ich keinen Einfluß habe.

Das ist schlecht. Wirklich ändern kannst Du es nämlich nur dort, wie
Thorsten im ersten Teil seines Postings richtig festgestellt hat.
(Aus dem zweiten Teil von Thorstens Posting werde ich ehrlich gesagt
nicht ganz schlau - das hat IMHO mit Deinem Problem nichts zu tun)

Da das Buffering aber meistens davon abhängt, ob die Ausgabe auf ein
Terminal erfolgt, kann man viele Programme zu ungebuffertem bzw.
zeilengebuffertem Schreiben überreden, indem man stdout bzw. stderr auf
ein Pseudoterminal umlenkt. Das Expect Package sollte dabei hilfreich
sein.

> Es wäre z.B. auch möglich das STDERR in ein anderes Programm
> umzuleiten und dort die Ausgaben an STDERR mit speziellen
> Sequenzen zu markieren und an STDOUT weiterzuleiten.

Nützt nichts, weil Du dabei natürlich genauso die relative Reihenfolge
von stdout und stderr verlierst (stdout ist ja nach wie vor gepuffert).

hp


--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"