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吗?
答案 0 :(得分:1)
两个事实:
logging.basicConfig
将不执行任何操作:
如果根记录器已经为其配置了处理程序,则此功能不起作用。
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)