【问题标题】:How to redirect TensorFlow logging to a file?如何将 TensorFlow 日志重定向到文件?
【发布时间】:2017-03-26 08:58:30
【问题描述】:

我正在使用 TensorFlow-Slim,它有一些有用的日志记录由tf.logging 打印到控制台。我想将这些日志重定向到文本文件,但找不到这样做的方法。我查看了tf_logging.py 源代码,它公开了以下内容,但似乎没有将日志写入文件的选项。如果我遗漏了什么,请告诉我。

__all__ = ['log', 'debug', 'error', 'fatal', 'info', 'warn', 'warning',
           'DEBUG', 'ERROR', 'FATAL', 'INFO', 'WARN',
           'flush', 'log_every_n', 'log_first_n', 'vlog',
           'TaskLevelStatusMessage', 'get_verbosity', 'set_verbosity']

【问题讨论】:

    标签: logging tensorflow


    【解决方案1】:

    你是对的,你没有办法做到这一点。

    如果你真的,肯定,绝对不能忍受,tf.logging 是基于 python 日志记录的。所以, import logging tf.logging._logger.basicConfig(filename='tensorflow.log', level=logging.DEBUG)

    请注意,您自己在不受支持的路径上,并且该行为可能随时中断。

    您也可以在我们的github issue 页面提交功能请求。

    【讨论】:

    • 从 TF 1.9 开始,此代码生成“AttributeError: module 'tensorflow.tools.api.generator.api.logging' has no attribute '_logger”'
    • 最佳答案对您有用吗?您现在可以使用logging.getLogger('tensorflow') 来获取记录器对象。
    • 不,它没有。虽然您可以获得一个名为 tensorflow 的记录器,但 TF 源本身的格式显然无法更改,也无法重定向到文件。我认为这可能是一个错误。
    • @KevinJohnsrude 请向我们的 github 页面和 CC drpngx 提交票证,以便我们在那里进行扩展讨论。谢谢!
    • 同样在 TF2.4 Message=module 'tensorflow' has no attribute 'logging'
    【解决方案2】:

    如果您在项目中使用 python 日志记录,其中一个选项是在日志记录配置文件中定义名称为“tensorflow”的记录器。

    然后_logger = _logging.getLogger('tensorflow') 将使用您的配置文件中的记录器和指定的处理程序。

    【讨论】:

      【解决方案3】:
      import logging
      
      # get TF logger
      log = logging.getLogger('tensorflow')
      log.setLevel(logging.DEBUG)
      
      # create formatter and add it to the handlers
      formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      
      # create file handler which logs even debug messages
      fh = logging.FileHandler('tensorflow.log')
      fh.setLevel(logging.DEBUG)
      fh.setFormatter(formatter)
      log.addHandler(fh)
      

      我的解决方案灵感来自this thread

      【讨论】:

      • 即使logging.NOTSET 也无法正常工作,'tensorflow.log' 文件为空。
      • 我可以确认这不会像那样工作。更改或不接触日志级别或格式化程序无济于事。 Python 3.8.5 和 tf 2.4
      【解决方案4】:

      一个简单的解决方法是将命令行的输出定向到文件。例如,

      python training.py 1> output.log 2> error.log
      # 1 for stdout stream and 2 for stderr stream
      

      根据公认的答案,好处是您可以获得所有日志。原因是并非所有的日志记录都来自 python(请记住运行时是用 C++ 实现的)。例如,您可以通过设置环境变量获得非常有用的调试日志记录(包括有关张量内存分配的信息)。

      import os
      os.environ['TF_CPP_MIN_VLOG_LEVEL'] = '3'
      

      (请注意注意。记录的数量惊人。)

      要想了解如何在 C++ 中实现日志记录,

      https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/platform/default/logging.h https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/platform/default/logging.cc

      特别是在这一行中,日志消息似乎被写入标准错误:

      https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/platform/default/logging.cc#L73

      我从here的讨论中引用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2017-01-03
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多