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')
我有一个有效的代码,但执行的操作我不明白。
此代码使用 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')