问题描述
我目前正在像这样加载 python 记录器:
import logging
logging.basicConfig(level=logging.INFO)
log = logging.getLogger("myprogram")
并像这样使用它:
[...]
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
时,推荐的显示回溯的方式是什么?
1楼
改为在DEBUG
级别记录异常并设置exc_info=True
。
logger.exception()
本质上是一个logger.error(..., exc_info=True)
调用,但您可以在任何级别记录异常回溯:
log.debug("could not open configuration file", exc_info=True)
重要的是exc_info
选项;
从:
如果
exc_info
未评估为 false,则会导致将异常信息添加到日志消息中。 如果提供了异常元组(以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)
我在没有FileNotFoundError(...)
表示的打印输出中包含了。
如果您使用命令行参数解析器,如argparse
或click
,那么请使用他们的用户反馈 API(通常也包括退出)。
您也可以使日志记录模块生成用户级消息,但是如果您希望单个记录器调用在文件中生成调试友好的回溯并在控制台上生成用户友好的输出,则必须为这些用途配置单独的处理程序- 控制台处理程序使用自定义以更改异常的显示方式。 将日志记录和最终用户通信分开会更容易、更清晰。
2楼
我会使用exc_info
和的组合:
try:
...
except FileNotFoundError as ex:
logger.error(ex, exc_info=log.getEffectiveLevel() == logging.DEBUG)
这样,异常本身( FileNotFoundError
)总是被记录下来,但只有在日志级别为调试时才会记录堆栈跟踪。
3楼
也可以直接使用logging.debug
加上traceback:
try:
do_something()
except Exception as e:
logger.error("Unhandled exception: %s", e)
logger.debug("Traceback: %s", traceback.format_exc())