Tail -F > OUTPUT problem
ColdFire 15.01.2010 - 14:44 1092 9
ColdFire
Addicted
|
Liebe linux gurus. Ich möchte ein laufendes DEBUG file das sich ab einer gewissen filesize ersetzt in eine datei schreiben. Eigentlich kein problem. tail -F lalaal.dbg | grep -i "MEINE INFORMATION"
funktioniert wunderbar. Nun möchte ich den output umleiten in meine textdatei tail -F lalaal.dbg | grep -i "MEINE INFORMATION" | tee neueslog.txt
Leider funktioniert das nicht so ganz tail -F lalaal.dbg | grep -i "MEINE INFORMATION" >> neueslog.txt
Auch mit diesem befehl nicht. tail -F same as --follow=name --retry Hat jemand eine Idee wie ich das machen kann. Wichtig ist das sich das logfile ersetzt ab einer gewissen filesize und somit der stream auch weg ist. Plz help. ColdFire
|
COLOSSUS
AdministratorGNUltra
|
Das ist aus diversen Gruenden nicht so einfach.
Zuallererst muss ich aber fragen: wer/was schreibt denn urspruenglich in lalaal.dbg?
|
Ringding
Pilot
|
Leider funktioniert das nicht so ganz Und wodurch äußert sich das?
|
ColdFire
Addicted
|
wer/was schreibt denn urspruenglich in lalaal.dbg? Ein Java programm schreibt den output auf den das ich leider keinen zugriff habe. zur frage warum es nicht funktioniert. Wenn ich den tail laufen lasse ohne den output zu schreiben sehe ich das ich information bekomme. Wenn ich ein wc -l output.txt bekomme ich als result 0 lg CF
|
COLOSSUS
AdministratorGNUltra
|
Dein Java-Programm erkennt also selbsttaetig, dass N bytes geschrieben wurden (und erachtet diese Menge als zu viel fuer ein File), und erstellt dann ein weiteres Logfile (das das alte ersetzt), und schreibt in dieses weiter, waehrend es das alte File loescht?
|
ColdFire
Addicted
|
Nicht ganz. Also die routine schaut ca so aus wenn die byteanz erreicht wird aus zb log1.dbg -- > log2.dbg und legt einen neue log1.dbg an.
lg CF
|
COLOSSUS
AdministratorGNUltra
|
D. h. das bisherige, "volle" Logfile wir umbenannt, und ein neues (mit dem alten Namen des nun abgeloesten Logfiles) wird erstellt?
|
ColdFire
Addicted
|
Richtig. So wie es eben bei logfiles so üblich ist.
|
Neo-=IuE=-
Here to stay
|
und wieso nicht logrotate einsetzen?
|
COLOSSUS
AdministratorGNUltra
|
Weil das Rotieren von der Java-Anwendung selbst uebernommen wird. ColdFire geht es aber darum, gewisse Informationen aus diesen Logfiles zu gewinnen, und diese irgendwohin (in eine andere Datei) zu exportieren.
Es ist nicht ganz trivial, das elegant zu loesen - Programme, die kein syslog() nutzen, wuerde ich persoenlich meiden, wenn es denn geht. Selber Logfiles schreiben ist einfach out. Der Linux-Kernel bietet allerdings einen eleganten Mechanismus, wie man da trotzdem was machen kann: inotify.
Mit inotify kannst du auf einem Directory Inode sog. "Watches" einrichten, die dir gewisse Events in diesem Directory (und wahlweise auch Directories darunter) melden. Solche Events beinhalten z. B. "Neue Datei wurde angelegt" bzw. "Datei wurde geloescht". Auch "rename" kann man tracken. Auf diese Events kannst du dann reagieren - mit Python geht das z. B. sehr komfortabel, aber auch auf der Shell ist das mit den inotify-tools moeglich.
Ich wuerde mir an deiner Stelle also ein kleines Programm schreiben, das das Logfile-Output-Directory mit entsprechenden Watches ausstattet, das gerade aktuelle Logfile nach deinen Wuenschen filtert und die Ausgabe irgendwohin umlenkt, und beim Auftauchen eines neuen Logfiles auf dieses "umschaltet" (und den alten fd schlieszt). Sollte in weniger als 30 Zeilen Python machbar sein, schaetze ich.
→ `man inotify`
|