【问题标题】:Writing append only gzipped log files in Python在 Python 中编写仅附加 gzip 压缩的日志文件
【发布时间】:2013-01-16 04:41:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 即使您不打算轮换日志,为什么不中断输出并每隔一段时间启动一个新文件呢?然后你可以在文件完成后运行 gzip。
  • @DavidZaslavsky 的回答是传统的解决方案。这只是标准的日志轮换,只是您省略了删除旧文件的部分。

标签: python gzip


【解决方案1】:

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

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

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


在 Python 2 中,logging.FileHandler 采用关键字参数 encoding,可以将其设置为 bz2zlib

这是因为logging usescodecs 模块,而bz2(或zlib)又将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 - 至少带有 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

【讨论】:

  • +1 用于解释如何为此目的使用 logrotate 的链接。 (好吧,除了我已经给你 +1 来解释如何在 Python 中做到这一点,如果你真的想......)
  • 将 logrotate 向上移动,因为我想这是正确的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多