Python 记录器:StreamHandler 不控制我的终端标准输出?

Python Logger : StreamHandler not controlling my terminal stdout?

我有 - 我相信 - 一个相当标准的记录器配置,带有两个处理程序:文件和流。文件处理程序工作得很好,我可以用自己的级别控制输出文件的内容,但流处理程序似乎没有做任何事情,无论我是否添加 StreamHandler,所有根日志都会传递到标准输出。有人会知道我做错了什么吗?

我是 运行 python3.10 Ubuntu 20.04,这是配置:

import logging
import sys

# root logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# terminal logger
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.CRITICAL)
logger.addHandler(stream_handler)
# file logger
file_handler = logging.FileHandler(f'logs/{__name__}.txt', 'w')
file_handler.setLevel(logging.DEBUG)
logger.addHandler(file_handler)

我试图将 sys.stdout 作为 StreamHandler() 的参数传递,但它并没有改变结果。 有了上面的内容,我希望控制台只打印 CRITICAL 但它显示了所有级别:

DEBUG:network:deserialized data: ['111', 'idle', 'normal']
INFO:network:ID:100 ['normal'] already exists, storing server_states[587]: (-13, 2890, 35, 69)
DEBUG:network:_entity.position.server_states={583: <rect(-17, 2713, 35, 69)>}
INFO:network:sending:100|idle['normal']|480;971;35;69|right|0|0|1000.0|3|None|0|0;0|0;0;0;0;0;0
INFO:network:received:107|idle['normal','collectable']12;2935;35;69|left|0|0|1000.0|3|None|45.1

我想知道它是否与记录器名称有关(来自模块 name 的动态)?

您的配置应该按预期工作。这个稍微修改过的脚本:

import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# terminal logger
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.CRITICAL)
logger.addHandler(stream_handler)
# file logger
file_handler = logging.FileHandler(f'logs/{__name__}.txt', 'w')
file_handler.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
for level in (logging.DEBUG, logging.INFO, logging.WARNING,
              logging.ERROR, logging.CRITICAL):
    if level:
        logger.log(level, "Event at %s", logging.getLevelName(level))

按预期工作,如下所示:

$ python3.10 test_71641676.py > tmp.txt
$ more tmp.txt
Event at CRITICAL

这表明 sys.stdout 被用于 StreamHandler

这似乎与我有多个模块这一事实有关——每个模块都可以有一个记录器来控制台,但主脚本必须保持控制并有自己的记录器集(我没有)。 此页面解决了我的问题:https://docs.python.org/3/howto/logging-cookbook.html#logging-to-multiple-destinations