Tensorflow抑制日志消息错误

时间:2019-07-11 08:00:32

标签: python tensorflow logging

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时,消息不出现,当我不出现时,消息出现。

我需要同时使用tensorflow和日志记录,因为我使用的是现有代码。有什么方法可以使日志记录抑制Tensorflow吗?

2 个答案:

答案 0 :(得分:1)

两个事实:

    如果已经配置了根记录器,则
  1. logging.basicConfig将不执行任何操作:

      

    如果根记录器已经为其配置了处理程序,则此功能不起作用。

  2. tensorflow具有absl-py依赖性,将在导入by appending a NullHandler to the root handler时尝试初始化日志记录:

    # 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记录器也可以这样做:

from absl import logging as absl_logging

absl_logging.get_absl_handler().use_absl_log_file(
    program_name='mytool',
    log_dir='/var/logs/'
)

答案 1 :(得分:1)

除了@hoefling提供的方法外,您还可以在进行日志记录配置之前清除root logger的handlers

logging.getLogger().handlers = []
# ...
logging.basicConfig(level=level, handlers=handlers)