首页 文章

python:logging.Logger和logging.getLogger之间的区别

提问于
浏览
4

是的,我看到python doc说:“ Logger 永远不会直接实例化,但总是通过模块级函数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") and set logger level to 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 回答

  • 3

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

    理想情况下,您将创建 Logger 并根据正确的命名/配置设置它们,而不是接受默认配置 .

相关问题