gpt4 book ai didi

Python 日志记录模块 : custom loggers

转载 作者:太空狗 更新时间:2023-10-29 20:59:29 26 4
gpt4 key购买 nike

我试图为日志记录创建一个自定义属性(调用者的类名、模块名等),但遇到了一个奇怪的异常,告诉我在该过程中创建的 LogRecord 实例没有必要的属性。经过一些测试后,我得到了这个:

import logging

class MyLogger(logging.getLoggerClass()):
value = None

logging.setLoggerClass(MyLogger)

loggers = [
logging.getLogger(),
logging.getLogger(""),
logging.getLogger("Name")
]

for logger in loggers:
print(isinstance(logger, MyLogger), hasattr(logger, "value"))

这段看似正确的代码产生:

False False
False False
True True

错误还是功能?

最佳答案

查看源码我们可以看到如下内容:

root = RootLogger(WARNING)
def getLogger(name=None):
if name:
return Logger.manager.getLogger(name)
else:
return root

即导入模块时默认创建根记录器。因此,每次您查找根 looger(传递一个假值,例如空字符串)时,您将获得一个 logging.RootLogger 对象,而不管对 logging 的任何调用。 setLoggerClass.

关于正在使用的记录器类,我们可以看到:

_loggerClass = None
def setLoggerClass(klass):
...
_loggerClass = klass

这意味着一个全局变量保存了将来要使用的记录器类。

除此之外,查看 logging.Manager(由 logging.getLogger 使用),我们可以看到:

def getLogger(self, name):
...
rv = (self.loggerClass or _loggerClass)(name)

也就是说,如果未设置 self.loggerClass(除非您明确设置它,否则不会设置),则使用全局变量中的类。

因此,这是一个功能。根记录器始终是一个 logging.RootLogger 对象,其他记录器对象是根据当时的配置创建的。

关于Python 日志记录模块 : custom loggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9317250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com