Python日志记录与文件轮换

45 投票
4 回答
77197 浏览
提问于 2025-04-17 12:10

我有一个用Python写的程序,它会把信息写入一个日志文件,这个文件会被Linux的logrotate命令进行轮换。当文件被轮换时,我需要通知我的程序停止写入旧文件,并开始写入新文件。我可以处理这个通知,但我该怎么告诉Python去写入新文件呢?

我这样打开文件:

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO)

然后这样写入内容:

logging.log(level,"%s" % (msg))

虽然日志模块看起来很强大,但也让我感到有些不知所措。谢谢。

4 个回答

12
from logging import handlers

handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE)

handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S"))

#LOG_ROTATE = midnight    
#set your log format

这段话是说,这个内容应该能帮你处理旋转日志的问题。

33

你可以看看 WatchedFileHandler 来实现这个功能,或者你也可以选择使用 RotatingFileHandler 来实现日志轮换,这两者都在 logging.handlers模块 中。

44

不要使用 logging.basicConfig,而是用 WatchedFileHandler。下面是如何使用它的介绍。

import time
import logging
import logging.handlers

def log_setup():
    log_handler = logging.handlers.WatchedFileHandler('my.log')
    formatter = logging.Formatter(
        '%(asctime)s program_name [%(process)d]: %(message)s',
        '%b %d %H:%M:%S')
    formatter.converter = time.gmtime  # if you want UTC time
    log_handler.setFormatter(formatter)
    logger = logging.getLogger()
    logger.addHandler(log_handler)
    logger.setLevel(logging.DEBUG)

log_setup()
logging.info('Hello, World!')
import os
os.rename('my.log', 'my.log-old')
logging.info('Hello, New World!')

撰写回答