python:logging.Logger和logging.getLogger之间的区别 [英] python: difference between logging.Logger and logging.getLogger

查看:1476
本文介绍了python:logging.Logger和logging.getLogger之间的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是的,我看到python doc说:记录器从未直接实例化,而是始终通过模块级函数logging.getLogger(name)进行实例化",但是我有一个调试问题,想知道根本原因. /p>

这是示例:

#!/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")并将级别设置为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")

解决方案

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

理想情况下,您将创建记录器并根据适当的命名/配置进行设置,而不是接受默认配置.

Yes, I see python doc says: "Loggers are never instantiated directly, but always through the module-level function logging.getLogger(name)", but I have an issue to debug and want to know the root cause.

here is the example:

#!/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")

Using logging.getLogger("test") here, log message will not be printed.

If I change logging.getLogger("test") to logging.Logger("test"), the log message will be printed.

#!/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")

Or we can using 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")

解决方案

The method .getLogger("test") is looking for any existing logger configurations for the name "test" while the .Logger("test") is creating a default logger with the name "test" and sets the default log level to 0. If the getLogger method doesn't find a logger class by that name then it will create a basic logger that will have an effective level of 30 (https://docs.python.org/3/library/logging.html#logging-levels) which will ignore your DEBUG message. You can check via logger.getEffectiveLevel() to notice the difference.

Ideally you would create loggers and set them based on the proper naming/configurations instead of accepting the default configuration.

这篇关于python:logging.Logger和logging.getLogger之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆