python日志打印跟踪仅在调试中

时间:2018-09-23 12:09:10

标签: python logging

我目前正在像这样加载python记录器:

import logging
logging.basicConfig(level=logging.INFO)
log = logging.getLogger("myprogram")

并使用它e。 G。像这样:

[...]
except FileNotFoundError:
    log.exception("could not open configuration file")
    sys.exit(1)

但是,这将始终打印回溯以及错误消息:

ERROR:myprogram:could not open configuration file
Traceback (most recent call last):
[...]
FileNotFoundError: [Errno 2] No such file or directory: 
'not/existing/file.yml'

我不希望在常规错误输出中进行追溯。相反,它应该只打印我的错误消息和异常信息(“没有此类文件...”)。

仅在将日志级别设置为logging.DEBUG时才显示回溯的推荐方式是什么?

3 个答案:

答案 0 :(得分:3)

改为在DEBUG级别记录异常,然后设置exc_info=Truelogger.exception()本质上是一个logger.error(..., exc_info=True)调用,但是您可以在任何级别记录异常回溯:

log.debug("could not open configuration file", exc_info=True)

重要的是exc_info选项;来自documentation

  

如果exc_info的评估结果不为假,则会导致将异常信息添加到日志消息中。如果提供了一个异常元组(由sys.exc_info()返回的格式)或一个异常实例,则使用它;否则,将调用sys.exc_info()以获取异常信息。

您可能要使用打印(到stdout或stderr)与最终用户进行通信:

except FileNotFoundError as e:
    log.debug("could not open configuration file", exc_info=True)
    print("Could not open configuration file:", e.strerror, file=sys.stderr)
    sys.exit(1)

我在打印输出中包括了system error message,但没有FileNotFoundError(...)表示形式。

如果您使用argparseclick之类的命令行参数解析器,请使用其用户反馈API(通常也包括退出)。

可以使日志记录模块也生成用户级别的消息,但是如果您希望单个记录器调用在文件中生成调试友好的回溯并在控制台上生成用户友好的输出,则您必须使用自定义Formatter() classoverride the formatException() method的控制台处理程序为这些用例配置单独的处理程序,以更改异常的显示方式。分开日志记录和最终用户通信将更加容易和清晰。

答案 1 :(得分:3)

我会结合使用exc_info.getEffectiveLevel

try:
    ...
except FileNotFoundError as ex:
   logger.error(ex, exc_info=log.getEffectiveLevel() == logging.DEBUG)

这样,总是记录异常本身(FileNotFoundError),但是只有在日志级别为debug的情况下,才会记录堆栈跟踪。

答案 2 :(得分:0)

您还可以直接使用logging.debug加上追溯:

try:
    do_something()
except Exception as e:
    logger.error("Unhandled exception: %s", e)
    logger.debug("Traceback: %s", traceback.format_exc())