23

所以我在玩他们昨天发布的 Google 的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和 a 的添加StreamHandler是我在查看其他人如何做到这一点时发现的,但看起来它与该事物的使用方式相吻合。但是,我对日志库没有深入的了解,因为它总是可以正常工作。

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

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

4

2 回答 2

26

我得到这个输出:

test
WARNING:TEST:test

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

logger.propagate = False

另请参阅简单 python 日志记录配置中的重复输出

跟进:这是 tensorflow 使用日志包的方式的意外副作用。我已经在 HEAD 将其更改为以“tensorflow”为名的内部记录器,以避免这种污染。应该在一天左右的时间内就在github头上。同时, logger.propagate 解决方案将起作用,并且一旦修复完成就不会中断,因此您应该可以放心使用。再次感谢您发现这一点!

Followup-Followup:从TensorFlow 1.14开始直接公开logger

import tensorflow as tf

logger = tf.get_logger()
于 2015-11-12T04:45:29.343 回答
2

logger.propagate = False解决了我的问题。我认为这是张量流的错误

于 2020-01-16T07:47:18.450 回答