问题 Tensorflow导致日志消息加倍


所以我正在玩谷歌 Tensorflow 他们昨天发布的图书馆遇到了一个令我讨厌的臭虫。

我所做的是像往常一样设置python日志记录功能,结果是,如果我导入tensorflow库,控制台中的所有消息都开始加倍。有趣的是,这样做  如果您只是使用,就会发生 logging.warn/info/..() 功能。

这样做的代码示例  加倍消息:

import tensorflow as tf
import logging

logging.warn('test')

代码的一个例子  双倍所有消息:

import tensorflow as tf
import logging

logger = logging.getLogger('TEST')
ch = logging.StreamHandler()
logger.addHandler(ch)

logger.warn('test')

现在,我是一个简单的人。我喜欢它的功能 logging所以我用它。设置与 logger 对象和添加 StreamHandler 是我接受的其他人如何做到这一点,但看起来它符合这个东西的用途。但是,我没有对日志库的深入了解,因为它总是有点工作。

因此,解释为什么消息加倍的任何帮助都将是最有帮助的。

我正在使用Ubuntu 14.04.3 LTS和Python 2.7.6,但错误发生在我尝试过的所有Python 2.7版本中。


11694
2017-11-12 00:51


起源

我很难在ubuntu 14.04上使用python 2.7.6复制这个:python testlog.py警告:root:test你能提供一些关于如何安装tf的更多细节吗? - dga
啊!你的示例代码中有一个拼写错误。最后一行应该是logger.warn('test')而不是logging.warn。现在我复制了它。答案更清楚 - 坚持下去。 - dga


答案:


我得到这个输出:

test
WARNING:TEST:test

Tensorflow是  使用日志记录框架并设置了自己的处理程序,因此在您记录时,默认情况下,它会传播到tensorflow内的父日志记录处理程序。您可以通过设置更改此行为:

logger.propagate = False

也可以看看 简单python日志配置中的重复输出

后续:这是tensorflow使用日志包的方式的意外副作用。我在HEAD更改了它的内部记录器,其名称为“tensorflow”以避免这种污染。应该在一天左右的github头。与此同时,logger.propagate解决方案将起作用,并且一旦修复程序进入就不会中断,因此您应该安全。再次感谢您发现这个!


13
2017-11-12 04:45



(我要检查这是真的有意还是错误 - 我从来没有遇到它或者想过太多。) - dga
谢谢你的回答,它按预期工作! - 5xum
Tensorflow没有以标准方式使用getLogger来使用日志包(名称),这就是你看到命名空间冲突的原因。我会为此发送一个补丁,看看我们是否可以让它更快乐。谢谢你询问这个! - dga
在REPL中仍然可以发生类似早期倍增效应的事情。不是问题,但可能会令人惊讶。我写了一点 发布日志并在那里更多地描述这种现象。 - Aaron Schumacher