Tensorflow вызывает протоколирование сообщений в два раза
Итак, я играл с 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
- это то, что я поднял, глядя на то, как это делают другие люди, но похоже, что это соответствует тому, как должна была использоваться эта вещь. Тем не менее, у меня нет глубоких знаний о библиотеке протоколирования, так как это всегда просто сработало.
Таким образом, любая помощь, объясняющая, почему происходит удвоение сообщений, будет наиболее полезной.
Я использую Ubuntu 14.04.3 LTS с Python 2.7.6, но ошибка возникает во всех версиях Python 2.7, которые я пробовал.
Ответы
Ответ 1
Я получаю этот вывод:
test
WARNING:TEST:test
Tensorflow также использует каркас журналирования и настроил свои собственные обработчики, поэтому при регистрации по умолчанию он распространяется до родительских обработчиков журналирования внутри tenorflow. Вы можете изменить это поведение, установив:
logger.propagate = False
См. также дубликаты вывода в простой конфигурации регистрации Python
Продолжение: Это было непреднамеренным побочным эффектом того, как тензорный поток использовал пакет журналирования. Я изменил его в HEAD, чтобы охватить его внутренние регистраторы под названием "tenorsflow", чтобы избежать этого загрязнения. Должен быть в голове GitHub в течение дня или около того. В то же время решение logger.propagate будет работать и не сломается, как только исправление будет исправлено, поэтому вы должны быть в безопасности. Еще раз спасибо за то, что заметили это!
Followup-Followup:
Начиная с TensorFlow 1.14 непосредственно предоставляет logger
:
import tensorflow as tf
logger = tf.get_logger()