2016-03-03 67 views
4

我只是偶然在试图证明同时使用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 

这怎么可能?

不应该保证记录器在返回之前在其输出流(不管它是文件还是控制台)上写入数据吗?

+0

日志记录包括'线程'和work side sideloop。 为可能的输出启动两个线程(主循环+日志记录)。 – dsgdfg

+0

你知道这是记录在哪里吗? –

+1

我也在寻找这种行为。所以我添加了一个kludge,让每次调用print()刷新stdout,这似乎让事情变得更好。但是在日志调用之后执行'print()'输出后,仍然有很多次输出日志。我无法相信,在Python中配置记录器以便与print()同步没有比较方法。 –

回答

1

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

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

没有任何影响,因为你实例化一个Formatter,然后扔掉的结果。您需要将格式化程序分配给Handler,并将其添加到Logger。这全部记录在Python stdlib documentation中。

其次,在你的例如两个不同输出流 - print写入sys.stdoutlogging.warning,没有其他的配置,写入sys.stderr。如何将这些流复用到单个控制台上并没有很好的定义,并取决于如何设置I/O缓冲,操作系统和其他因素。

+0

格式化程序对不起,我忘了从我的代码中删除它。 –

相关问题