【问题标题】:How to create a new log file every time the application runs?每次应用程序运行时如何创建一个新的日志文件?
【发布时间】:2017-11-21 23:37:57
【问题描述】:

目前,这就是我所拥有的 (testlog.py):

import logging
import logging.handlers

filename = "example.log"

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

handler = logging.handlers.RotatingFileHandler(filename, mode = 'w', backupCount = 5)
handler.setLevel(logging.DEBUG)
handler.setFormatter(formatter)
logger.addHandler(handler)

ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)

for i in range(10):
   logger.debug("testx") #where I alternate x from 1 thru 9 to see output

它目前已成功打印到控制台和example.log,这正是我想要的。

每次我运行它时,它都会生成一个新文件并替换旧的example.log,如下所示:

  • 使用 logger.debug("test1") 运行 - example.log 将包含 test1 10 次。

  • 使用 logger.debug("test2") 运行 - 它会重写 example.log 以包含 test2 10 次。

  • 等等……

但是,我希望代码在每次运行程序时创建一个新的日志文件,这样我就有:

example.log
example.log1
example.log2 
...
example.log5

总之,我希望这个文件将日志消息打印到控制台、日志文件,并且每当我运行程序时我都想要一个新的日志文件(最多 *.5)。

【问题讨论】:

  • 已解决!我所做的只是在末尾添加logging.handlers.RotatingFileHandler.doRollover(handler)
  • 不要在最后做——如果你的脚本在中点结束时失败,你将不会在下一次开始时获得新的日志文件。在初始化日志记录时执行此操作。

标签: python logging python-logging


【解决方案1】:

logging.handlers.RotatingFileHandler 根据大小或日期轮换您的日志,但您可以使用 RotatingFileHandler.doRollover() 强制轮换,如下所示:

import logging.handlers
import os

filename = "example.log"

# your logging setup

should_roll_over = os.path.isfile(filename)
handler = logging.handlers.RotatingFileHandler(filename, mode='w', backupCount=5)
if should_roll_over:  # log already exists, roll over!
    handler.doRollover()

# the rest of your setup...

应该像魅力一样工作。

【讨论】:

  • 每次运行都会创建空日志文件
  • set delay = True,避免创建空日志文件
  • 如何添加时间戳而不是 .log.1, .log.2 ?
  • @Vrishank RotatingFileHandler 使用基本文件名来确定旋转的日志名称,您不能将其设置为使用时间戳或除 <base_name>.<n> 之外的其他任何内容来用于旋转文件。话虽这么说,这是 Python,你总是可以覆盖内部结构让它做你的投标,你可以在this answer 中查看一种方法。
【解决方案2】:

如果您在 zwer 发布的解决方案中将模式更改为“a”,那么您在第一次运行时会得到一个空日志文件,之后它将按预期工作。只需将 backupCount 增加 +1 :-)

【讨论】: