gpt4 book ai didi

python - 调用 `logging` 会干扰其他模块

转载 作者:行者123 更新时间:2023-12-04 08:16:30 25 4
gpt4 key购买 nike

假设我有以下 a.py调用 b.pyb.py

import logging

logging.info('11111 in b')

def do():
logging.info('2222222 in b')
a.py
import logging
import sys
import b

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.info('11111111 in a')
b.do()
当我执行 a.py ,没有任何记录到 stdout , 但是当我注释掉 logging.info('11111 in b')来自 b.py如下: b.p是的
import logging

# logging.info('11111 in b')

def do():
logging.info('2222222 in b')
我可以看到日志输出:
INFO:root:11111111 in a
INFO:root:2222222 in b
所以很明显这与注释掉的行有关,但我会认为 basicConfig()导入后会直接设置 b模块,但不是。
有人可以解释一下这里发生了什么吗?

最佳答案

进口声明import b在配置日志系统之前触发了日志事件。当使用未配置的日志系统记录事件时,它会使用默认配置自动配置:stderr 上级别为 WARNING 的流处理程序。
随后的basicConfig如果根记录器已经配置了处理程序,则 call 什么也不做。因此,INFO 级别的事件被过滤掉,因为根记录器配置了一个处理程序,其阈值为 WARNING 的较高阈值。
正确的解决方案是确保在配置日志系统之前不记录事件。通常这意味着避免日志事件或在全局(模块级别)范围内进行任何工作。
但是,since Python 3.8有一种解决方法可以强制重新配置日志系统:

logging.basicConfig(stream=sys.stdout, level=logging.INFO, force=True)
在较旧的 Python 版本中,您可以手动清除根日志记录处理程序:
del logging.getLogger().handlers[:]
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

关于python - 调用 `logging` 会干扰其他模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65676510/

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