我正在构建一个服务,我从多个源(每个源一个文件)记录纯文本格式日志。我不打算旋转这些日志,因为它们必须永远存在。
为了使这些文件永远变小,我希望我能在飞行中对它们进行gzip。由于它们是日志数据,因此文件压缩得非常好。
在Python中编写仅附加gzip压缩文本文件的好方法是什么,以便以后可以在服务开启和关闭时恢复写入?我并不担心丢失几行,但如果gzip容器本身发生故障并且文件变得不可读,那就不行了。
另外,如果不行,我可以简单地将它们写成纯文本而不用gzipping,如果它不值得麻烦。
答案 0 :(得分:8)
注意:在unix系统上,您应该认真考虑使用为此确切任务编写的外部程序:
logrotate
(旋转,压缩和邮寄系统日志)您可以设置旋转的数量,以便删除第一个文件in 100 years左右。
在Python 2中,logging.FileHandler
采用可设置为encoding
或bz2
的关键字参数zlib
。
这是因为logging
uses 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
Python 3版本(虽然文档mention 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