2013-01-31 4 views
6

Ich baue einen Dienst, wo ich Textformat-Protokolle von mehreren Quellen log (eine Datei pro Quelle). Ich habe nicht vor, diese Protokolle zu rotieren, da sie für immer da sein müssen.Schreiben anhängen nur gzip-Log-Dateien in Python

Um diese für immer um Dateien kleiner mache ich hoffe, dass ich sie in Flug gzip könnte. Da es sich um Protokolldaten handelt, werden die Dateien sehr gut komprimiert.

Was ist ein guter Ansatz in Python zu schreiben anhängen-only gzipped Textdateien, so dass das Schreiben später wieder aufgenommen werden kann, wenn Service geht an und aus? Ich bin nicht so besorgt über das Verlieren einiger Zeilen, aber wenn der Gzip-Container selbst zusammenbricht und die Datei unlesbar wird, ist das kein Nein.

Auch wenn es nicht gehen ist, kann ich sie einfach als normaler Text schreiben in ohne Gzipping wenn es sich nicht lohnt der Aufwand ist.

+1

wenn Sie nicht beabsichtigen, die Protokolle zu drehen, warum nicht die Ausgabe brechen und eine neue Datei in einem während jeder einmal anfangen? Dann können Sie gzip ausführen, nachdem eine Datei fertig ist. –

+1

@ DavidZaslavsky's Antwort ist die traditionelle Lösung. Es ist nur Standard-Log-Rotation, außer dass Sie den Teil weglassen, wo Sie die alten Dateien löschen. – abarnert

Antwort

8

Hinweis: Auf Unix-Systemen sollten Sie ernsthaft in Erwägung ziehen, ein externes Programm verwenden, für diese genaue Aufgabe geschrieben:

  • logrotate (dreht, komprimiert und Mails Systemprotokolle)

Sie können einstellen, die Anzahl der Rotationen so hoch, dass die erste Datei gelöscht würde in 100 years oder so.


In Python 2, logging.FileHandler nimmt ein Schlüsselwort Argument encoding, die bz2zlib oder eingestellt werden können.

Dies liegt daran, logginguses das codecs Modul, das wiederum bz2 behandelt (oder zlib) als Codierung:

>>> import codecs 
>>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2") as fh: 
...  fh.write("Hello World\n") 

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World 

Python 3-Version (obwohl die docs mentionbz2 als Alias, Sie ‚ll haben tatsächlich bz2_codec verwenden - zumindest w/3.2.3):

Auch
+2

+1 für den Link, der erklärt, wie 'logrotate' für diesen Zweck verwendet wird. (Nun, außer dass ich Ihnen bereits +1 gegeben habe, um zu erklären, wie man es in Python macht, wenn Sie wirklich wollen ...) – abarnert

+1

Logrotate wurde verschoben, weil ich denke, dass es das Richtige wäre. – miku