在Python中写入仅追加的gzipped日志文件

6 投票
1 回答
1845 浏览
提问于 2025-04-17 14:23

我正在建立一个服务,用来记录来自多个来源的纯文本日志(每个来源一个文件)。我不打算对这些日志进行轮换,因为它们需要永久保存。

为了让这些永久保存的文件变得更小,我希望能在写入时直接进行gzip压缩。因为这些是日志数据,所以文件压缩效果很好。

在Python中,有什么好的方法可以写入只追加的gzip文本文件,以便在服务开关时可以继续写入?我不太担心丢失几行数据,但如果gzip文件本身损坏,导致文件变得无法读取,那就麻烦了。

另外,如果这个方法不可行,我也可以选择直接写入纯文本,不进行gzip压缩,如果这样做更简单的话。

1 个回答

8

注意:在Unix系统上,你应该认真考虑使用一个专门为这个任务编写的外部程序:

  • logrotate(用于轮换、压缩和发送系统日志)

你可以设置轮换的次数非常高,甚至可以让第一个文件在大约100年后才被删除。


在Python 2中,logging.FileHandler有一个关键字参数encoding,可以设置为bz2zlib

这是因为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

撰写回答