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()