Python TimedRotatingFileHandler同时记录到文件和标准错误

9 投票
2 回答
21982 浏览
提问于 2025-04-16 20:45

我想在我的应用程序中加入简单的日志记录,使用的是TimedRotatingFileHandler。不过我发现日志不仅输出到了指定的文件里,还输出到了标准错误(stderr)中。我把问题简化成了一个小例子:

import logging, logging.handlers
import sys

logging.basicConfig(format='%(asctime)s %(message)s')
loghandler = logging.handlers.TimedRotatingFileHandler("logfile",when="midnight")
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(loghandler)

for k in range(5):
    logger.info("Line %d" %  k)

我在我的'logfile'和这个程序的标准错误中都得到了5行日志。我到底哪里做错了呢?

2 个回答

5

logging.basicConfig 是用来设置一个处理器,它会把信息打印到标准错误输出,也就是你在程序出错时看到的地方。

logger.addHandler(loghandler) 是用来添加一个定时轮换文件处理器,这个处理器会定期把日志信息保存到文件里。

你想要停止输出到标准错误吗?如果想的话,只需要去掉对 logging.basicConfig 的调用就可以了。

17

这是一个方法,可以让你把打印的信息只记录在日志文件里,而不显示在标准输出或标准错误上:

import logging
from logging.handlers import TimedRotatingFileHandler

logHandler = TimedRotatingFileHandler("logfile",when="midnight")
logFormatter = logging.Formatter('%(asctime)s %(message)s')
logHandler.setFormatter( logFormatter )
logger = logging.getLogger( 'MyLogger' )
logger.addHandler( logHandler )
logger.setLevel( logging.INFO )

for k in range(5):
    logger.info("Line %d" %  k)

撰写回答