TensorFlow日志为何无输出或重复?tf.estimator.Estimator日志问题
解决TensorFlow Estimator日志重复输出的问题
我之前也碰到过一模一样的情况,其实根源很好理解:TensorFlow内部有一套自己的日志处理机制,当你用logging.basicConfig配置日志时,会给Python的root logger自动添加一个默认的StreamHandler。而TensorFlow的日志输出会同时被它自身的handler和这个新添加的handler捕获,于是就出现了重复打印的现象。
下面给你几个亲测有效的解决方案:
方案一:移除TensorFlow默认的日志Handler
直接禁用TensorFlow自带的日志输出handler,只保留你自定义的配置:
import logging import tensorflow as tf # 先配置你的自定义日志格式 logging.basicConfig( format='[%(name)s] : %(asctime)s : %(levelname)s : %(message)s', level=logging.INFO ) # 获取TensorFlow的logger实例,移除它所有的默认handler tf_logger = logging.getLogger('tensorflow') for handler in tf_logger.handlers[:]: tf_logger.removeHandler(handler)
这样TensorFlow的日志就只会通过你配置的handler输出,不会再重复打印了。
方案二:使用TensorFlow自带的日志配置
既然用了Estimator,也可以完全用TensorFlow提供的日志工具来配置,从根源避免和Python标准logging的冲突:
import tensorflow as tf # 设置TensorFlow的日志级别 tf.logging.set_verbosity(tf.logging.INFO) # 自定义日志格式 formatter = tf.logging.Formatter('[%(name)s] : %(asctime)s : %(levelname)s : %(message)s') # 获取TensorFlow的默认handler并替换格式 for handler in tf.logging.get_logger().handlers: handler.setFormatter(formatter)
这种方式完全依托TensorFlow自身的日志系统,不会和标准logging产生交叉,自然也就不会出现重复输出。
方案三:调整root logger级别,过滤TensorFlow日志
如果你不想改动TensorFlow的handler,可以把root logger的级别设得比TensorFlow的日志级别更高,比如TensorFlow输出INFO级别的话,把root logger设为WARNING,这样root logger就不会捕获TensorFlow的INFO日志了:
import logging import tensorflow as tf # 配置root logger为WARNING级别,只输出WARNING及以上的日志 logging.basicConfig( format='[%(name)s] : %(asctime)s : %(levelname)s : %(message)s', level=logging.WARNING ) # 单独给TensorFlow的logger设置INFO级别 tf_logger = logging.getLogger('tensorflow') tf_logger.setLevel(logging.INFO)
不过这种方法可能会影响其他模块的日志输出,需要根据你的实际需求来选择。
你可以根据自己的场景挑一个最合适的方案,我自己用方案一和方案二比较多,都能完美解决重复日志的问题~
内容的提问来源于stack exchange,提问作者imhuay
相关产品推荐
相关产品推荐

