Python 日志记录总是无缘无故地在控制台上打印消息

Python Logging always print message on console without reason

我有一个有效的代码,但执行的操作我不明白。 此代码使用 logging python 模块。问题是,当我 运行 这个脚本时,控制台上总是(除了正常的流日志之外)我不想要的一行(STDOUT 中的第二行在这个 post).

我不明白为什么会有这条线以及如何解决这个问题。

我认为问题是由于 logging.basicConfig(level=logging.INFO) 的使用引起的,但我需要使用它,因为如果我不使用它,logger.info('This is a INFO-01') 就不会工作,只有警告等级别。 .. 我尝试了几件事,但只是产生了错误,并且在 Internet 上找不到答案。

import logging

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)

c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file07.log')
c_handler.setLevel(logging.INFO)
f_handler.setLevel(logging.INFO)

c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

logger.addHandler(c_handler)
logger.addHandler(f_handler)


logger.info('This is a INFO-01')

标准输出:

2021-12-11 17:54:30,203 - INFO - This is a INFO-01
INFO:__main__:This is a INFO-01

如果有人能帮助我,我将不胜感激。 亲切

你猜对了。从文档中查看 this image

默认传播是True。所以你的 logger对象有一个名为“root”的父记录器。

basicConfig 通过创建一个带有默认 Formatter 的 StreamHandler 并将其添加到根记录器来为日志系统进行基本配置。

'root' 是所有记录器的父级。因此,在您的 logger 记录器的处理程序处理完消息后,它将传递给父记录器的处理程序,并且因为它现在有一个处理程序,所以它会以默认格式第二次输出该消息。

您可以删除它,因为您不需要它。不要忘记为您的 logger 指定 LEVEL:(我删除了下面代码中的 f_handler 处理程序)

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)  # <----- here

c_handler = logging.StreamHandler()
c_handler.setLevel(logging.INFO)

c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)

logger.addHandler(c_handler)

logger.info('This is a INFO-01')