Tensorflow会导致日志消息翻倍。

24

我在昨天玩了一下谷歌发布的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版本都会出现错误。


我在Ubuntu 14.04上,使用Python 2.7.6也无法复制这个问题:python testlog.py WARNING:root:test您能否提供有关如何安装tf的更多详细信息? - dga
啊!你的示例代码中有个打字错误。最后一行应该是logger.warn('test')而不是logging.warn。我已经复制了它。现在答案更清晰了 - 稍等片刻。 - dga
2个回答

29

我得到了这个输出:

test
WARNING:TEST:test

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

logger.propagate = False

另请参阅在简单的Python日志配置中重复输出

跟进:这是TensorFlow使用日志包的方式意外产生的副作用。我已经在HEAD更改它,将其内部记录器的范围限定在名称为“tensorflow”下,以避免此污染。应该会在一天左右内呈现在GitHub的头文件中。与此同时,“logger.propagate”解决方案将能够正常工作,并且一旦修复完成就不会中断,因此您可以放心使用。再次感谢发现这个问题!

后续跟进:从TensorFlow 1.14开始,直接公开了logger

import tensorflow as tf

logger = tf.get_logger()

我要检查一下这是否是预期的结果还是一个错误 - 我从未遇到过或者多想过这个问题。 - dga
1
Tensorflow 没有按照 getLogger(name) 的标准方式使用 logging 包,这就是为什么你看到了该命名空间冲突的原因。我会发送一个补丁来解决这个问题,看看能否让它更加顺畅。感谢你对此的询问! - dga
2
类似于之前的加倍效应,REPLs中仍然可能发生。这不是问题,但可能会让人感到惊讶。我写了一篇有关日志记录的小文章,并在那里更详细地描述了这种现象。[http://planspace.org/20170322-tensorflow_logging/] - Aaron Schumacher
@dga 这个问题应该被修复了吧?在 TensorFlow 2.X 中我又遇到了这个问题。 - daniel451

2

logger.propagate = False 解决了我的问题。我认为这是tensorflow的一个bug。


1
你的答案和被采纳的答案有什么区别? - Calos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接