2013-01-31 14 views
6

私はいくつかのソース(ソースごとに1つのファイル)からプレーンテキスト形式のログを記録するサービスを構築しています。私はこれらのログを永遠に周回する必要があるので、これらのログをローテーションするつもりはありません。Pythonでgzip形式のログファイルのみを書き込む

これらのファイルを永遠に小さくするために、私は飛行機でそれらをgzipできますことを願っています。ログデータなので、ファイルは非常によく圧縮されます。

サービスのオン/オフ時に書き込みを後で再開できるように、Pythonで追加専用のgzippedテキストファイルを書き込むのは良い方法ですか?私はいくつかの行を失うことを心配していませんが、gzipコンテナ自体が壊れてファイルが読めなくなっても、それはいいえではありません。

また、無駄な場合は、面倒なことがなければ、gzippingせずにプレーンテキストとして簡単に書き込むことができます。

+1

ログをローテーションするつもりがない場合でも、出力を中断してしばらく毎に新しいファイルを開始してみましょう。そして、ファイルが完成した後でgzipを実行することができます。 –

+1

@ DavidZaslavskyの答えは伝統的な解決策です。これは、古いファイルを削除する場所を除外することを除いて、標準のログローテーションです。この目的のために 'logrotate'を使う方法を説明しているリンクのためには+1 – abarnert

答えて

8

注:

あなたが設定することができます

  • logrotate(回転、圧縮、及びメールシステムログ):UNIXシステムでは、あなたが真剣にこの正確なタスクのために書かれた外部プログラムを、使用することを検討すべきですローテーションの番号がと高いので、最初のファイルが削除されますin 100 years程度です。パイソン2において


    logging.FileHandlerbz2はまたはzlibに設定することができるキーワード引数encodingをとります。

    これはlogginguses順番にbz2を扱うcodecsモジュール(又はzlib)エンコーディングとして:

    >>> 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バージョン(ただし、ドキュメント別名としてmentionbz2、あなた実際にbz2_codec - 少なくともw/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 
    
+2

+1。 (まあ、あなたが本当にしたいのであれば、私はすでにPythonでそれを行う方法を説明するため+1を与えたことを除いて) – abarnert

+1

私はそれが正しいことだと思うので、logrotateを動かしました。 – miku

関連する問題