2016-11-19 188 views
1

是的,我看到python文档说:“记录器永远不会直接实例化,但总是通过模块级功能logging.getLogger(name)”,但我有一个问题调试并想知道根本原因。python:区别logging.Logger和logging.getLogger

这里是例如:

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

使用logging.getLogger( “测试”)这里,日志消息将不被打印。

如果我将logging.getLogger(“test”)更改为logging.Logger(“test”),将会打印日志消息。

#!/usr/bin/python 
import logging 
logger = logging.Logger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

或者,我们可以使用logging.getLogger( “测试”)集记录水平logging.DEBUG。

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 
logger.setLevel(logging.DEBUG) 

logger.info("test") 

回答

2

方法.getLogger("test")正在寻找的名称"test"任何现有的记录器的配置,而.Logger("test")正在创建一个名为"test"默认记录器,并设置默认的日志级别为0。如果getLogger方法没有找到一个记录器类,然后它将创建一个基本的记录器,其有效等级为30(https://docs.python.org/3/library/logging.html#logging-levels),它将忽略您的DEBUG消息。您可以通过logger.getEffectiveLevel()进行检查以了解其差异。

理想情况下,您可以创建记录器并根据正确的命名/配置进行设置,而不是接受默认配置。

+0

似乎并不能解释为什么使用Logger(“test”)而不是getLogger(“test”)时打印的消息。他们两个都得到了日志级别为0的logging.Logger对象。 – vts

+0

请参阅编辑,当我提交时没有意识到它的一部分被切断。 – ioneyed

+0

感谢ioneyed,我看到检查logger.getEffectiveLevel(),.Logger(“test”)后不会从任何记录器继承,而.getLogger(“test”)将从具有默认日志级别的根记录器继承== 30。 – vts