6

我正在构建一项服务,在该服务中记录来自多个来源的纯文本格式日志(每个来源一个文件)。我不打算轮换这些日志,因为它们必须永远存在。

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

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

另外,如果不行,我可以简单地将它们写成纯文本而不用 gzip 压缩,如果它不值得麻烦的话。

4

1 回答 1

8

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

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

您可以将旋转次数设置得如此之高,以至于第一个文件将在 100 年左右被删除。


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

这是因为logging 使用了该codecs模块,该模块又将bz2(or zlib) 视为encoding

>>> 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
于 2013-01-31T22:56:31.430 回答