13

目前,这就是我所拥有的(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将包含test110 次,就像它应该的那样。

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

  • ETC...

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

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

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

4

2 回答 2

31

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...

应该像魅力一样工作。

于 2017-06-19T17:19:50.883 回答
0

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

于 2020-10-28T09:45:15.797 回答