6

複数のソース(ソースごとに1つのファイル)からのプレーンテキスト形式のログをログに記録するサービスを構築しています。これらのログは永遠に存在する必要があるため、ローテーションするつもりはありません。

これらを永久にファイルの周りで小さくするために、私はそれらをその場でgzip圧縮できることを望みます。それらはログデータであるため、ファイルは非常によく圧縮されます。

後でサービスがオンまたはオフになったときに書き込みを再開できるように、追加専用のgzip圧縮されたテキストファイルを書き込むためのPythonの優れたアプローチは何ですか?数行が失われることについてはそれほど心配していませんが、gzipコンテナー自体が故障し、ファイルが読み取れなくなった場合、それは問題ありません。

また、うまくいかない場合は、面倒なことをしなくても、gzipを使用せずにプレーンテキストで簡単に書き込むことができます。

4

1 に答える 1

8

注: UNIX システムでは、まさにこのタスク用に作成された外部プログラムの使用を真剣に検討する必要があります。

  • logrotate(ローテーション、圧縮、およびシステム ログのメール送信)

ローテーション数を非常に高く設定して、最初のファイルが100 年程度で削除されるようにすることができます。


Python 2 では、またはに設定できるlogging.FileHandlerキーワード引数を取ります。encodingbz2zlib

これは、(または) をencodingとして扱うモジュールをlogging 使用しているためです。codecsbz2zlib

>>> 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 バージョン (ドキュメントではエイリアスとして言及 bz2されていますが、実際には使用する必要がありますbz2_codec- 少なくとも 3.2.3):

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

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World
于 2013-01-31T22:56:31.430 に答える