Tensorflow导致日志消息加倍

5xu*_*xum 16 python logging tensorflow

所以我正在玩他们昨天发布的Google的Tensorflow库,遇到了一个令我讨厌的烦人的bug.

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

不会使消息加倍的代码示例:

import tensorflow as tf
import logging

logging.warn('test')
Run Code Online (Sandbox Code Playgroud)

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

import tensorflow as tf
import logging

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

logger.warn('test')
Run Code Online (Sandbox Code Playgroud)

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

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

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

dga*_*dga 18

我得到这个输出:

test
WARNING:TEST:test
Run Code Online (Sandbox Code Playgroud)

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

logger.propagate = False
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在 REPL 中仍然会发生类似早期加倍效应的事情。不是问题,但可能会令人惊讶。我写了一点[关于日志的帖子](http://planspace.org/20170322-tensorflow_logging/) 并在那里更多地描述了这种现象。 (2认同)