Tensorflow подавляет ошибку регистрации сообщений - PullRequest
4 голосов
/ 11 июля 2019

Tensorflow скрывает и не отображает сообщения журнала при запуске кода.

Я попробовал следующее, но не смог найти способ заставить мой код работать.

import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)


import os
import tensorflow as tf

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

Итак, мой код следующий

import logging
import tensorflow as tf

logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Я ожидал, что отладочные сообщения будут в моем файле example.log, но внутри журнала примеров ничего не появилось.Когда я импортирую тензорный поток, сообщения не появляются, а когда нет -

Мне нужно использовать и тензор потока, и логи, потому что я использую существующий код.Есть ли способ, чтобы протоколирование подавляло Tensorflow?

1 Ответ

1 голос
/ 12 июля 2019

Два факта:

  1. logging.basicConfig ничего не сделает, если корневой регистратор уже настроен:

    Эта функция ничего не делает, если для корневого регистратора уже настроены обработчики.

  2. tensorflow имеет зависимость absl-py, которая попытается инициализировать ведение журнала при импорте , добавив NullHandler к корневому обработчику :

    # The absl handler will always be attached to root, not the absl logger.
    if not logging.root.handlers:
      # Attach the absl handler at import time when there are no other handlers.
      # Otherwise it means users have explicitly configured logging, and the absl
      # handler will only be attached later in app.run(). For App Engine apps,
      # the absl handler is not used.
      logging.root.addHandler(_absl_handler)
    

    Не уверен, почему обработчик подключен к корневому логгеру, а не к absl, хотя - может быть ошибкой или обходным путем для какой-то другой проблемы.

Таким образом, проблема в том, что вызов import tensorflow вызовет import absl.logging, что вызывает раннюю настройку логгера. Последующий вызов (ваш) на logging.basicConfig ничего не изменит. Чтобы это исправить, вам нужно настроить ведение журнала перед импортом tensorflow:

import logging
logging.basicConfig(filename='example.log', level=logging.DEBUG)
import tensorflow as tf

logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Практическое правило: всегда вызывайте конфигурацию регистрации как можно раньше.

Запись логов в формате по умолчанию в файл

Если вы просто хотите записать логи по умолчанию в файл, abseil logger также может сделать это:

from absl import logging as absl_logging

absl_logging.get_absl_handler().use_absl_log_file(
    program_name='mytool',
    log_dir='/var/logs/'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...