我正在构建一项服务,在其中记录来自多个源的纯文本格式日志(每个源一个文件)。我不打算轮换这些日志,因为它们必须永远存在。
为了使这些永远存在的文件更小,我希望我可以在飞行中对它们进行 gzip 压缩。由于它们是日志数据,因此文件压缩得很好。
在 Python 中编写仅附加 gzip 文本文件的好方法是什么,以便稍后在服务启动和关闭时可以恢复写入?我并不担心丢失几行,但如果 gzip 容器本身崩溃并且文件变得不可读,那是没有问题的。
另外,如果不行的话,我可以简单地将它们写为纯文本,而不需要进行 gzip 压缩(如果不值得这么麻烦的话)。
注意:在 UNIX 系统上,您应该认真考虑使用专门为此任务编写的外部程序:
-
logrotate http://linuxcommand.org/man_pages/logrotate8.html(轮转、压缩和邮件系统日志)
您可以设置数量旋转如此之高,第一个文件将被删除100年后 https://serverfault.com/a/50185/4346 or so.
在Python 2中,logging.FileHandler
采用关键字参数encoding
可以设置为bz2
or zlib
.
这是因为logging
uses http://hg.python.org/cpython/file/8ee6d96a1019/Lib/logging/__init__.py#l919 the codecs
模块,依次处理bz2
(or zlib
) as 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 版本(尽管文档mention http://docs.python.org/3.3/library/codecs.html#standard-encodings 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)