首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python记录器输出与记录器和处理程序级别不匹配

Python记录器输出与记录器和处理程序级别不匹配
EN

Stack Overflow用户
提问于 2022-11-04 22:48:06
回答 1查看 44关注 0票数 1

我创建了一个带有StreamHandler的定制Python,最初设置为logging.INFO级别。这正确地隐藏了DEBUG级别的日志并输出了INFO级别的日志。

我还创建了一个函数,将记录器和处理程序的级别更改为logging.DEBUG。打印出logger.getEffectiveLevel()handler.level都表明它确实发生了变化。

然而,当我期望INFO级别的日志也出现时,我仍然只能获得DEBUG级别的日志。我遗漏了什么?查看了一堆具有类似问题的帖子,但所有这些帖子都试图使用根记录器进行日志记录,并且丢失或没有配置它们的处理程序,这里的情况并非如此。

Python版本3.8.6。

代码分为两部分:

  1. 主要执行:
代码语言:javascript
复制
logger = get_logger("my_logger") // Creates custom Python logger

async def main():
    <...Other code...>

    logger.debug("Before update")
    logger.info("Before update")
    print(f"{logger.name} - {logger.getEffectiveLevel()}")
    for handler in logger.handlers:
        print(f"{type(handler)} - {handler.level}")

    <...Code that updates level for get_level() function...>

    update_log_levels() // Function that changes logging level

    print(f"{logger.name} - {logger.getEffectiveLevel()}")
    for handler in logger.handlers:
        print(f"{type(handler)} - {handler.level}")

    logger.debug("After update")
    logger.info("After update")

if __name__ == "__main__":
    asyncio.run(main())
  1. 自定义记录器
代码语言:javascript
复制
class CustomLogger(logging.Logger):
    def __init__(self, name: str, level: int):
        super().__init__(name, level)

        handler = logging.StreamHandler()
        handler.setLevel(level)
        handler.setFormatter(FORMATTER)
        self.addHandler(handler)

loggers = {}

def get_logger(name: str):
    level = get_level() // Function that gets level
    if name not in loggers.keys():
        loggers[name] = CustomLogger(name, level)

    return loggers[name]

def update_log_levels():
    for _, logger in loggers.items():
        level = get_level() // Function that gets level
        logger.setLevel(level)
        for handler in logger.handlers:
            handler.setLevel(level)

我得到的输出:

代码语言:javascript
复制
2022-11-04 15:06:40,102 - my_logger - INFO     - Before update
my_logger - 20
<class 'logging.StreamHandler'> - 20
my_logger - 10
<class 'logging.StreamHandler'> - 10
2022-11-04 15:06:40,102 - my_logger - INFO     - After update
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-05 03:10:55

这是因为标准的logging模块不是为该模式设计的。Logger实例应该由logging.getLogger()创建。(参见参考文献。它写着“永不”。)

使用logging.setLoggerClass()注册CustomLogger并调用logging.getLogger()

您可以像这样操作现有的记录器。

代码语言:javascript
复制
logger_names = set()

def get_logger(name):
    logger_names.add(name)
    return logging.getLogger(name)

def update_log_levels():
    for name in logger_names:
        logger = logging.getLogger(name)
        ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74323695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档