python:logging.Logger和logging.getLogger

时间:2016-11-19 15:44:43

标签: python logging

是的,我看到python doc说:"记录器永远不会直接实例化,但总是通过模块级函数logging.getLogger(name)",但我有一个问题需要调试并希望知道根本原因。

这是一个例子:

#!/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(" test"),将不会打印日志消息。

如果我将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(" test")将logger级别设置为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")

1 个答案:

答案 0 :(得分:4)

方法.getLogger("test")正在寻找名称"test"的任何现有记录器配置,而.Logger("test")正在创建名为"test"的默认记录器并设置默认日志如果getLogger方法找不到该名称的记录器类,那么它将创建一个有效级别为30(https://docs.python.org/3/library/logging.html#logging-levels)的基本记录器,它将忽略您的DEBUG消息。您可以通过logger.getEffectiveLevel()查看注意区别。

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