限制Python日志记录文件大小

3

据我所知,使用 RotatingFileHandler 和它的属性 maxBytes 可以限制python中日志文件的大小。

为了测试这个功能,我编写了以下脚本:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("Rotating Log")
logger.setLevel(logging.INFO)

# add a rotating handler
handler = RotatingFileHandler("test.log", maxBytes=1)
logger.addHandler(handler)

x = 0
while True:
    x += 1
    logger.info(x)

尽管日志文件不应超过1字节,但很快就会上升到数兆字节。我该如何限制它?不幸的是文档非常糟糕。我还想知道如何确保每次重新运行python脚本时,日志文件都被清除并重新开始记录,但是在文档中它只是简单地说了一下。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

If mode is not specified, 'a' is used. 

然而,它并没有说明除了'a'之外还有哪些选项可用。

总结以下问题:

  1. 如何将日志文件大小限制为10兆字节
  2. 如何确保在运行脚本时启动新的日志文件,而不是附加旧的日志文件

编辑:我尝试使用maxBytes = 1000000,但结果仍然相同。 日志文件仍然在变大。


我不会期望maxBytes = 1能够工作。记录是基于行的,而不是基于字符的。这可能仅仅是一个无效的设置,因为几乎任何日志消息都已经超过了最大大小。如果您设置一个更合理的maxBytes值,您是否会得到相同的行为? - larsks
我刚刚尝试了一下将maxBytes设置为1000000(1兆字节),并增加了字符串的大小以稍微提高速度。在我中断之前,它已经达到了1.1 GB。 - cheesus
1个回答

2
你可以查看RotatingFileHandler类的第二部分。
当当前日志文件长度接近maxBytes时,会触发rollover;但是如果maxBytes或backupCount中有任何一个为零,则不会触发rollover,所以你通常需要将backupCount设置为至少1,并且maxBytes不能为零。
看起来你没有设置backupCount值。
当backupCount为非零值时,系统将通过将扩展名“.1”、“.2”等附加到文件名来保存旧的日志文件。
例如,备份数为5,基本文件名为app.log,则会得到app.log、app.log.1、app.log.2,一直到app.log.5。始终写入的文件是app.log。
当这个文件被填满时,它就会被关闭并重命名为app.log.1。如果存在app.log.1、app.log.2等文件,则它们分别被重命名为app.log.2、app.log.3等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接