[Vienna-pm] Logger: Threads, STDERR und Pipes?

Schroettner Robert rs at ednet.at
Sun Jun 29 18:38:20 CDT 2003


Hallo !

On Sun, 29 Jun 2003, Thomas Klausner wrote:

> Hmm, reichlich kompliziert.
> 
> Ich wuerde da ev auch versuchen einen daemon zu schreiben und alle
> Log-MEssages an den zu schicken (aber andererseits arbeite ich zu 95% in
> Web-Umgebungen, wo das Error-Loggen etwas weniger kompliziert ist..)
> 
> > Oder hab ich mich mit meiner Problemstellung voellig verrannt und ich
> > brauche nur ein 'use GoodLikeLogger'???
> 
> Eine kurze CPAN-Suche liefert:
> Tie::STDERR
> IO::Capture::Stderr
> Tye::Syslog

Wo gibts diese Module??
Das einzige was ich bei einer Suche nach 'STDERR' auf CPAN.org "The Module
List" finde ist:

System2            bdpfb like system(), but with STDOUT, STDERR avail

Dost hab ich bisher immer gesucht und angenommen, dass dort alle Module zu
finden sind - Wie ich aber gerade bemerkt habe, gibt es unter
"Search Modules" noch andere Module...

Aber nichts desto trotz bringen mir diese Module (zumindest lt. README)
nicht wirklich was.

> Hab aber keines dieser Module verwendet.
> 
> Rennen alle diese Programme im selben Prozess oder sind's verschiedene?

Ja das ist ja das nette: Die Programme verwenden gemeinsame Module (die
warings schreiben wollen) und laufen teils als CGI, teils ueber cron und
teils interaktiv. Und damit das ganze noch komplizierter wird, sollen
einige CGI-Programme background Prozesse anwerfen die dann in gemeinsame
Log-Files schreiben. Dieses gemeinsame Logging kann ich allerdings nicht
ueber syslog realisieren, da ich da in einige hundert verschiedene
Log-Files schreiben muss.

Nur mit 'STDERR ueber Socket auf einen Daemon umleiten' wirds wohl nicht
gehen, da ich einerseits den Output noch mit Timestamp, $0 und PID
versehen will, und anderseits diesen modifizieren Output _auch_ nach
STDERR schreiben muss. D.h. nur fuers File-Logging werde ich wohl einen
Daemon brauche und den Rest im Programm erledigen muessen.

Ich hab es mittlerweile soweit hinbekommen, dass ich mit einem Thread
STDERR umschreibe. Leider bekomme ich noch beim beenden ein 'Scalars
Leaked' und das beenden des Thread ist auch noch nicht ganz sauber
(beende mittels 'CLOSE-Kommando' und nicht einfach nur durch schliessen
des Filehandles)

Weiss bisher nichtmal so recht, wie ich diese Meldung unterdruecken kann,
da die Ausgabe erst nach Ausfuehrung meiner END{}-Bloecke kommt.

Gibts vielleicht irgendwo eine brauchbare Perl-Threads-Doku? Ich denke
mein Problem liegt entweder an einer falschen Deklaration/Verwendung von
'pipe' oder ': shared'.

Ich mache jetzt einfach ein:

my ($reader, $writer);
sub ... {
	open $oldSTDERR, '>&STDERR' or die...
	pipe $reader, $writer or die ...
	threads->new(&\myThread, $reader, $oldSTDERR
}

Gebe ich $reader im Hauptprogramm und $_[0] im Thread aus, verweisen die
auf verschiedene Adressen ('GLOB(0x???)'. Dh. die werden scheinbar beim
erstellen des Threads dupliziert. Wird da moeglicherweise beim benenden
des Threads ein angegorderetes Filehandle nicht nicht mehr freigegeben?

Zusaetzlich verwenden ich einen Hash, der als ' : shared' deklariert ist,
um meine Einstellungen an den Thread zu uebergeben. Dabei verwenden ich im
Hauptprogramm und im Thread immer 'lock(%myConfigHash)' bevor ich vom/zum
Hash lese/schreibe. Moeglicherweise gibts auch da irgendwo das Leak?

Kann man irgendwie einen Memory-Dump erstellen, sodass ich irgendwie
feststellen kann, was da genau Leaked?

> Wenn alles in einem Prozess ist, koenntest du ja mit entweder mit einer
> globalen Variable oder irgendeinem Namespace-Trick arbeiten, um immer in
> dasselbe File zu loggen.

Sind leider mehrere Prozesse aus mehreren Files.

> Wenn's verschiedene Prozesse sind, schau dir mal das Zeugs im IPC-Namsepace
> an. 

Ich denke, dass ich das irgendwie mit einem zentralen File-Logger Griff
bekomme. Ich denke da an ein Programm, das einfach auf einen Socket hoert
und dem ich den gewuenschten Filenamen uebergebe und dann die
schon formatieren Fehlerzeilen schicke. Moeglicherweise laesst sich das
Problem aber auch einfach mit Lock-Files loesen... Allerdings koennten
sich dann meine Programme gegenseitig locken - was bei CGI's wieder zu
Problemen fuehren koennte...

Liebe Gruesse, Schroettner Robert

|   Schroettner Robert
|   IT-Services
|   Eurodata Datenverarbeitungsdienst Ges.m.b.H.  __   _
|   Tel:  +43-1-7747076-51                       / /  (_)__  __ ____  __
|         +43-664-4345798                       / /__/ / _ \/ // /\ \/ / 
|   Fax:  +43-1-7747076-12                     /____/_/_//_/\_,_/ /_/\_\
|   WWW:  http://www.ednet.at                           TUX for President
|
|   EURODATA - WIEN - PRAG - BRUENN - BUDAPEST - BUCAREST




More information about the Vienna-pm mailing list