Tensorflow 导致日志消息加倍
Posted
技术标签:
【中文标题】Tensorflow 导致日志消息加倍【英文标题】:Tensorflow causes logging messages to double 【发布时间】:2016-02-13 06:11:53 【问题描述】:所以我在玩他们昨天发布的 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
对象和添加StreamHandler
的设置是我在查看其他人是如何做到这一点的时候发现的,但它看起来符合这个东西的用途。但是,我对日志库没有深入的了解,因为它总是能正常工作。
因此,任何解释为什么会发生消息翻倍的帮助都会非常有帮助。
我正在使用带有 Python 2.7.6 的 Ubuntu 14.04.3 LTS,但在我尝试的所有 Python 2.7 版本中都会出现错误。
【问题讨论】:
我很难在 ubuntu 14.04 上用 python 2.7.6 复制这个:python testlog.py WARNING:root:test 你能提供更多关于你如何安装 tf 的细节吗? 啊!您的示例代码中有一个错字。最后一行应该是 logger.warn('test') 而不是 logging.warn。现在我已经复制了它。答案更清楚了 - 等等。 【参考方案1】:我得到这个输出:
test
WARNING:TEST:test
Tensorflow也使用了日志框架,并设置了自己的处理程序,所以当你记录时,默认情况下,它会传播到 tensorflow 内的父日志处理程序。您可以通过设置更改此行为:
logger.propagate = False
另见duplicate output in simple python logging configuration
跟进:这是 tensorflow 使用日志包的方式的意外副作用。我已经在 HEAD 将其更改为以“tensorflow”为名的内部记录器,以避免这种污染。应该在一天左右的时间内就在github头上。同时, logger.propagate 解决方案将起作用,并且一旦修复完成就不会中断,因此您应该可以放心使用。再次感谢您发现这一点!
跟进-跟进:
以TensorFlow 1.14 开头直接暴露logger
:
import tensorflow as tf
logger = tf.get_logger()
【讨论】:
(我将检查这是否是真正的意图或错误 - 我从未遇到过或想太多。) Tensorflow 没有以标准的 getLogger(name) 方式使用日志记录包,这就是您看到命名空间冲突的原因。我会为此发送一个补丁,看看我们是否可以让它更快乐。感谢您提出这个问题! 在 REPL 中仍然会发生类似早期的倍增效应。不是问题,但可能会令人惊讶。我写了一点post on logging 并在那里更多地描述了这种现象。 @dga 这不应该被修复吗?在 TensorFlow 2.X 中再次遇到该问题【参考方案2】:logger.propagate = False
解决了我的问题。我认为这是张量流的一个错误
【讨论】:
你的答案和接受的答案有什么区别?以上是关于Tensorflow 导致日志消息加倍的主要内容,如果未能解决你的问题,请参考以下文章