Python RotatingFileHandler似乎没有旋转日志

2024-04-20 10:59:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我用以下代码设置了一个记录器:

log = logging.getLogger('base')
logfilename =  <path to logfile>
logFile = logging.FileHandler(logfilename)
log.setLevel(debug)
logFile.setFormatter(logging.Formatter('[%(asctime)s]: [%(filename)s:%(lineno)d:%(funcName)s]: %(levelname)s :: %(message)s', datefmt='%m-%d-%Y %H:%M:%S'))
log.addHandler(logFile)

因为日志文件很大,所以我想创建一个循环日志文件。 因此,我做了以下更改:

^{pr2}$

但是,生成的日志文件不会被旋转。我仍然可以得到几兆字节大的日志。我已清除所有.pyc文件。在

问题:

  1. 是否需要指定备份计数(我需要保留所有日志!因此,如果这是强制性的,我必须给出一些疯狂的大数字)。在
  2. 通过maxBytes我假设它是实际的字节(因此在我的例子中,日志应该每1kb旋转一次),而没有其他字节。我说的对吗?在
  3. 是否有一个最小值maxBytes低于该值旋转无效?(我想不是)

我使用python2.7.14(Anaconda)和3.6.4(Anaconda)。在


Tags: 文件topath代码logbase字节logging
2条回答

docs

if either of maxBytes or backupCount is zero, rollover never occurs, so you generally want to set backupCount to at least 1, and have a non-zero maxBytes.

这意味着如果不设置backupCount(默认值为0),就无法获得任何滚动功能

I need to retain all logs! Hence if this is mandatory, I have to give some insanely large number

是的!设置一个非常大的数字,并且可能每隔一段时间添加另一个脚本来备份旧文件

您需要设置一个backupCount值,将文件模式从追加更改为打开时截断。在

日志文件已关闭,但随后会再次打开以附加,因此您不会真正看到差异。在

现在的情况是:

  • 处理程序测试当前文件长度加上消息是否将文件长度推到最大值。
    • 如果长度超过最大值,请关闭文件
    • 如果backupCount大于零,请旋转所有现有的备份文件,然后重命名日志文件以添加.1
    • 打开日志文件进行追加。如果已经存在同名文件,则会重新打开该文件。在
  • 将消息写入打开的日志文件。在

除了将backupCount设置为大于0的数字外,还可以将mode参数改为'w',此时文件每次变得太大时都会被截断

# 'rotate' logfile by truncating:
logFile = RotatingFileHandler(logfilename, mode='w', maxBytes=1024)

请注意,如果新消息本身的长度大于1024个字节,则文件仍可能大于maxBytes。在

没有选项可以保留所有旋转的文件。你必须使用一个非常高的数字,使用不同的文件旋转策略。例如,TimedRotatingFileHandler在给定的时间间隔后旋转文件,如果您将backupCount设置为零,它将永远不会删除旋转的备份。在

您还可以子类RotatingFileHandler()来实现自己的重命名策略,提供自己的doRollover()方法。如果要保留所有备份,则需要生成唯一的名称;可以添加一个UUID来确保这一点(连同日期):

^{pr2}$

相关问题 更多 >