Python日志记录和文件轮换

44

我有一个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个回答

43

不要使用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!')

@TyHitzeman 您的意思是RotatingFileHandler。RollingFileHandler是Java的东西。 - proski
1
这对于原始帖子和其他Unix用户非常有效。针对Windows用户的提示:根据文档,您无法使用WatchedFileHandler。请改用RotatingFileHandler - Tyler Dane Hitzeman

33

1
谢谢!如果需要的话,我可以采用这种方法,但目前文件已经在我的代码之外被旋转了。我希望有一种关闭日志并重新打开它的方法。 - fredsnertz
1
啊...WatchedFileHandler...现在我明白了。 - fredsnertz
1
有没有选项可以将当前未被写入的滚动日志不压缩(压缩)?例如,文档提到RotatingFileHandler会生成app.log.1app.log.2等,但理想情况下,这些滚动日志可以选择性地压缩以节省空间。 - user9074332

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

这应该会帮助您处理日志轮换


9

既然轮换已经由logrotate完成,在信号处理程序中,您应该只需要再次调用logging.basicConfig(...),这样就可以重新打开日志文件。


2
如果已经运行了basicConfig,则它是一个无操作。如果要强制重新配置所有内容,则必须首先设置logging.root.handlers = [] - Edmund

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