Status von geöffneten Files
Hallo Zusammen, anknuepfend an meine letzte Frage: "grep Logfiles mit re" moechte ich nun das grepen des Logfiles optimieren, indem ich das File geoeffnet halte und regelmaeßig jeweils bis zum Ende lese und entsprechend grepe. Das Problem ist nun folgendes: das Logfile wird rotiert. Das heisst, es wird verschoben. Das bekomme ich aber von dem Pythonscript aus überhaupt nicht mit - ein read() funktioniert auch weiterhin und liefert einen leeren String - was rein logisch auch ein regulaeres Ergebnis waere - es muss ja nichts dazu gekommen sein. Die einzige Möglichkeit die ich bis jetzt gefunden habe, heraus zu bekommen ob das File noch aktuell ist, ist ein write() - erst dann wird eine exception geworfen. Nun moechte ich aber ein Logfile nicht schreiben. Gibts da einen besseren Ansatz ? Gruesse Steffen PS: auf den letzten Thread hatte ich zwar geantwortet - aber leider nicht an die Liste sondern nur an den Verfasser - falls sich jemand gewundert hat, warum da nichts mehr gekommen ist. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
--On 31. Januar 2006 12:24:34 +0100 Steffen Oschatz <steffen.oschatz@philips.com> wrote:
Hallo Zusammen,
anknuepfend an meine letzte Frage: "grep Logfiles mit re" moechte ich nun das grepen des Logfiles optimieren, indem ich das File geoeffnet halte und regelmaeßig jeweils bis zum Ende lese und entsprechend grepe.
Vielleicht hilft Dir das "lsof" Kommando? -aj _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Andreas, vom Prinzip her hast du da natürlich recht, allerdings möchte kein externes Kommando benutzen und den Output parsen. Da ich das Skript optimieren will sollten es also keine aufwaendigen Operationen sein. Pythonischer ginge dies natürlich mit os.stat bzw. os.path.getsize, wenn man sich auf dieses Kriterium beschraenken moechte- oder wenn doch nicht dann eine Pruefsumme verwenden. Meine Frage zielte er daraufhin ab, ob so etwas bei "Batteries included" schon dabei ist. Andreas Jung <lists@andreas-jung.com> wrote on 31.01.2006 12:39:19:
--On 31. Januar 2006 12:24:34 +0100 Steffen Oschatz <steffen.oschatz@philips.com> wrote:
Hallo Zusammen,
anknuepfend an meine letzte Frage: "grep Logfiles mit re" moechte ich nun das grepen des Logfiles optimieren, indem ich das File geoeffnet halte und regelmaeßig jeweils bis zum Ende lese und entsprechend grepe.
Vielleicht hilft Dir das "lsof" Kommando?
-aj
[attachment "attz2uzj.dat" deleted by Steffen Oschatz/HBG/SC/PHILIPS]
The information contained in this message is confidential and may be legally privileged. The message is intended solely for the addressee(s). If you are not the intended recipient, you are hereby notified that any use, dissemination, or reproduction is strictly prohibited and may be unlawful. If you are not the intended recipient, please contact the sender by return e-mail and destroy all copies of the original message. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hi! On Tue, 31 Jan 2006, Steffen Oschatz wrote:
vom Prinzip her hast du da natürlich recht, allerdings möchte kein externes Kommando benutzen und den Output parsen. Da ich das Skript optimieren will sollten es also keine aufwaendigen Operationen sein. Pythonischer ginge dies natürlich mit os.stat bzw. os.path.getsize, wenn man sich auf dieses Kriterium beschraenken moechte- oder wenn doch nicht dann eine Pruefsumme verwenden. Meine Frage zielte er daraufhin ab, ob so etwas bei "Batteries included" schon dabei ist.
Andreas Jung <lists@andreas-jung.com> wrote on 31.01.2006 12:39:19:
--On 31. Januar 2006 12:24:34 +0100 Steffen Oschatz <steffen.oschatz@philips.com> wrote:
Hallo Zusammen,
anknuepfend an meine letzte Frage: "grep Logfiles mit re" moechte ich nun das grepen des Logfiles optimieren, indem ich das File geoeffnet halte und regelmaeßig jeweils bis zum Ende lese und entsprechend grepe.
Vielleicht hilft Dir das "lsof" Kommando?
Ich empfehle dir einen Blick auf stat(). Ist ein neues File unter altem Namen aufgetaucht, wird es einen anderen I-Node haben als das File, das du schon geoeffnet hast. Vor allem ist stat() nicht sonderlich teuer, was ressourcen angeht, das kann man als durchaus oefter machen. Gruss, Tobias -- You don't need eyes to see, you need vision. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Steffen Oschatz schrieb:
anknuepfend an meine letzte Frage: "grep Logfiles mit re" moechte ich nun das grepen des Logfiles optimieren, indem ich das File geoeffnet halte und regelmaeßig jeweils bis zum Ende lese und entsprechend grepe.
Hallo, ich habe da so den leisen Verdacht, dass du damit gegen die Unix-Semantik von Dateien anarbeitest. Wenn du eine Datei offen hast und ein anderes Programm verändert sie, dann siehst du das nicht. Also ist ein unabhängiges 'stat' hier wohl das richtige. Dann müsstest du den Teil der Datei überspringen, den du (entsprechend der vorherigen Länge) schon gelesen hast und kannst ab da greppen. Zumindest, wenn nur angehängt wird und nichts innerhalb der Datei passiert, aber das sollte bei Log-Files der Fall sein. Also: Datei nicht auflassen, sondern einfach bei Änderung neu öffnen und den bekannten Teil per 'seek' überspringen. Klingt nicht so aufwändig, dass es in der stdlib implementiert werden müsste - und ist wahrscheinlich eh das effizienteste, da das Betriebsystem mit großer Wahrscheinlichkeit alle benötigten Daten (inodes und angehängten Dateiteil) noch im Speicher hat. Gruß, Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Steffen Oschatz wrote:
Die einzige Möglichkeit die ich bis jetzt gefunden habe, heraus zu bekommen ob das File noch aktuell ist, ist ein write() - erst dann wird eine exception geworfen. Nun moechte ich aber ein Logfile nicht schreiben.
Gibts da einen besseren Ansatz ?
Wie Stefan Behnel schon bemerkt hat: Mit tell() die aktuelle Position geben lassen, mit stat() überprüfen, ob sich die Datei geändert hat, dann wieder neu suchen, mit seek() an die Stelle springen und von da weiter lesen. Vorsicht bei Umbenennungen: Wenn das logfile rotiert, willst Du vermutlich noch den Rest zwischen Deinem letzten Lesen und der Umbenennung verarbeiten; außerdem willst Du die neue Datei von vorn verarbeiten. Dazu musst Du die Umbenennung erkennen. Am einfachsten ist das auch mit stat: Wenn sich die Inode-Nummer ändert, wurde die Datei umbenannt. Außerdem sollte die Datei nicht kleiner werden, und (wenn Du ganz sicher gehen willst) sollten die letzten 100 Bytes vor der Stelle, an der du abgesetzt hast, auch noch die gleichen sein. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Martin, Stefan, das mit der I-node war eine gute Idee - da bin ich nicht darauf gekommen. Da ich nur eine Liste mit file objects halten wollte und mir bis gestern nur die os.stat Funktion gekannt hatte, welche aber nur mit Pfad Angaben arbeitet, hatte ich mich noch ein wenig dagegen gestraeubt. Das hat sich geaendert nachdem ich doch endlich mal die komplette Standard lib durchgeschaut hatte und dabei eine Variante fand die mit fd arbeitet. Damit werde ich jetzt auf Euren Vorschlag eingehen. Danke fuer die Tipps. Gruesse Steffen "Martin v. Löwis" <martin@v.loewis.de> wrote on 31.01.2006 19:56:47: ...
Wie Stefan Behnel schon bemerkt hat: Mit tell() die aktuelle Position geben lassen, mit stat() überprüfen, ob sich die Datei geändert hat, dann wieder neu suchen, mit seek() an die Stelle springen und von da weiter lesen. ...
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
"Martin v. Löwis"
-
Andreas Jung
-
Stefan Behnel
-
Steffen Oschatz
-
Tobias Klausmann