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
我有 - 我相信 - 一个相当标准的记录器配置,带有两个处理程序:文件和流。文件处理程序工作得很好,我可以用自己的级别控制输出文件的内容,但流处理程序似乎没有做任何事情,无论我是否添加 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