2013-01-31 16 views
6

我正在構建一個服務,我從幾個源(每個源一個文件)記錄純文本格式的日誌。我不打算旋轉這些日誌,因爲它們必須永遠存在。在Python中只附加gzip日誌文件

爲了讓這些永遠在文件更小,我希望我可以gzip他們飛。由於它們是日誌數據,文件壓縮得非常好。

在Python中編寫僅附加gzip壓縮文本文件的好方法是什麼,以便在服務開啓和關閉時可以稍後恢復寫入?我並不擔心會丟失幾行代碼,但如果gzip容器本身發生故障並且文件變得不可讀取,那就不行了。

此外,如果沒有去,我可以簡單地將它們寫成純文本而不用gzip,如果它不值得麻煩的話。

+1

即使您不打算旋轉日誌,爲何不中斷輸出並每隔一段時間啓動一個新文件?然後你可以在文件完成後運行gzip。 –

+1

@ DavidZaslavsky的答案是傳統的解決方案。這只是標準的日誌輪換,除了你省略了刪除舊文件的部分。 – abarnert

回答

8

注:在UNIX系統上,你應該認真考慮使用外部程序,對這個確切的任務寫:

  • logrotate(旋轉,壓縮和郵件系統日誌)

可以設置轉數這麼高,那第一個文件就會被刪除in 100 years左右。


在Python 2,logging.FileHandler需要一個關鍵字參數encoding可以設置到bz2zlib

這是因爲loggingusescodecs模塊,這又會將bz2(或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鏈接解釋如何使用'logrotate'來達到此目的。 (好吧,除了我已經給你+1解釋瞭如何在Python中完成它,如果你真的想......) – abarnert

+1

將logrotate向上移動,因爲我猜這是正確的做法。 – miku