为什么控制台记录器与打印不同步?

时间:2016-03-03 06:52:18

标签: python asynchronous logging console

当我尝试使用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

这怎么可能?

在返回之前,是否应该保证记录器在其输出流(无论是文件还是控制台)上写入?

1 个答案:

答案 0 :(得分:1)

这些是您的问题引发的几个不同问题。首先,声明

logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')

无效,因为您正在实例化Formatter然后丢弃结果。您需要将格式化程序分配给Handler,并添加到Logger。这些都记录在Python stdlib documentation

其次,您的示例中有两个不同的输出流 - print写入sys.stdoutlogging.warning没有其他配置,写入{{ 1}}。这些流如何复用到单个控制台上的定义并不明确,取决于I / O缓冲的设置方式,操作系统和其他因素。