【问题标题】:Python Logging always print message on console without reasonPython Logging 总是无缘无故地在控制台上打印消息
【发布时间】:2022-01-15 21:30:15
【问题描述】:

我有一个可以工作的代码,但做了一些我不理解的事情。 此代码使用logging python 模块。问题是当我运行这个脚本时,控制台上总是有一行我不想要的(除了正常的流日志之外)(这篇文章底部的 STDOUT 中的第二行)。

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

我认为这个问题是由于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

如果有人可以帮助我,我将非常感激。 亲切的

【问题讨论】:

  • 您正在使用 basicConfig() 添加一个处理程序,然后您手动添加更多处理程序。难怪你不止一次得到线路。

标签: python logging python-logging


【解决方案1】:

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

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

basicConfig 实质上是通过使用默认格式化程序创建StreamHandler 并将其添加到根记录器来为日志系统进行基本配置。

“根”是所有记录器的父级。因此,在您的 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')

【讨论】:

  • 谢谢。这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 2016-04-28
相关资源
最近更新 更多