因此,我在玩昨天他们发布的Google的Tensorflow库,遇到了一个烦人的bug,一直困扰着我。
我所做的就是像往常一样设置python日志记录功能,结果是,如果我导入tensorflow库,控制台中的所有消息都会开始加倍。有趣的是,如果仅使用该函数,则 不会 发生这种情况logging.warn/info/..()。
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对象以及添加aStreamHandler来完成此设置,但看起来与该对象的使用方式相适应。但是,我对日志记录库没有深入的了解,因为它总是可以工作的。
logging
logger
StreamHandler
因此,任何有助于解释为什么消息加倍的帮助将是最有帮助的。
我正在将Ubuntu 14.04.3 LTS与Python 2.7.6结合使用,但是该错误在我尝试过的所有Python 2.7版本中均发生。
我得到以下输出:
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()