编写仅在Python中附加gzip压缩日志文件

Mik*_*maa 6 python gzip

我正在构建一个服务,我从几个源(每个源一个文件)记录纯文本格式日志.我不打算旋转这些日志,因为它们必须永远存在.

为了使这些文件永远变小,我希望我能在飞行中对它们进行gzip.由于它们是日志数据,因此文件压缩得非常好.

在Python中编写仅附加gzip压缩文本文件的好方法是什么,以便以后可以在服务开启和关闭时恢复写入?我并不担心丢失几行,但如果gzip容器本身发生故障并且文件变得不可读,那就不行了.

此外,如果它不行,我可以简单地将它们写成纯文本而不用gzipping,如果它不值得麻烦.

mik*_*iku 8

注意:在unix系统上,您应该认真考虑使用为此确切任务编写的外部程序:

  • logrotate (旋转,压缩和邮寄系统日志)

您可以将旋转次数设置得如此之高,以便在100年左右的时间内删除第一个文件.


在Python 2中,logging.FileHandler接受一个encoding可以设置为bz2或的关键字参数zlib.

这是因为logging 使用codecs模块,而这又治疗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
Run Code Online (Sandbox Code Playgroud)

Python 3版本(尽管文档提到 bz2别名,你实际上必须使用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
Run Code Online (Sandbox Code Playgroud)

  • +1链接解释如何使用`logrotate`来实现此目的.(好吧,除了我已经给你+1解释如何用Python做,如果你真的想......) (2认同)