当我尝试使用print和控制台记录器在控制台上显示消息时,我偶然发现了以下令人惊讶的行为:
import logging
for i in range(1, 10):
print("Hello")
logging.warning("Hello world")
# Possible result:
Hello
WARNING:root:Hello world
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
# Expected result:
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
WARNING:root:Hello world
这怎么可能 ?
是否应该保证记录器在返回之前写入其输出流(无论是文件还是控制台)?
最佳答案 这些是您的问题提出的几个不同的问题.首先,声明
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
没有效果,因为您正在实例化Formatter然后丢弃结果.您需要将格式化程序分配给Handler,然后将其添加到Logger中.这一切都记录在Python stdlib documentation中.
其次,在您的示例中有两个不同的输出流 – 打印写入sys.stdout而logging.warning,没有其他配置,写入sys.stderr.这些流如何复用到单个控制台上的定义并不明确,取决于I / O缓冲的设置方式,操作系统和其他因素.