在Python中写入仅追加的gzipped日志文件
我正在建立一个服务,用来记录来自多个来源的纯文本日志(每个来源一个文件)。我不打算对这些日志进行轮换,因为它们需要永久保存。
为了让这些永久保存的文件变得更小,我希望能在写入时直接进行gzip压缩。因为这些是日志数据,所以文件压缩效果很好。
在Python中,有什么好的方法可以写入只追加的gzip文本文件,以便在服务开关时可以继续写入?我不太担心丢失几行数据,但如果gzip文件本身损坏,导致文件变得无法读取,那就麻烦了。
另外,如果这个方法不可行,我也可以选择直接写入纯文本,不进行gzip压缩,如果这样做更简单的话。
1 个回答
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
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