如何将Python异常日志输出至DEBUG流而非ERROR流?
实现DEBUG级别输出异常堆栈信息
当然可以实现,核心思路是利用logging.debug()方法并传入exc_info=True参数——logging.exception()本质就是固定调用logging.error(msg, exc_info=True),我们只需要把级别换成DEBUG即可。
基础实现代码
直接修改你的示例代码,替换logging.exception为带参数的logging.debug:
import logging # 先调整root日志级别为DEBUG(默认是WARNING,会屏蔽DEBUG级日志) logging.basicConfig(level=logging.DEBUG) try: raise RuntimeError('terrible horrible error') except Exception: logging.warning('an exception happened') # 用DEBUG级别输出带堆栈的异常信息 logging.debug('error occurred here', exc_info=True)
运行后输出会变成:
WARNING:root:an exception happened
DEBUG:root:error occurred here
Traceback (most recent call last):
File "C:\Users...\PycharmProjects\project\main.py", line 31, in
raise RuntimeError('terrible horrible error')
RuntimeError: terrible horrible error
分流到不同输出流的配置
如果要实现异常事实到一个流、堆栈信息到另一个流的需求,需要给logging配置两个不同的Handler,分别过滤对应级别:
import logging from io import StringIO # 创建两个输出流对象 warning_output = StringIO() debug_output = StringIO() # 配置WARNING级别Handler:只处理WARNING及以上日志 warning_handler = logging.StreamHandler(warning_output) warning_handler.setLevel(logging.WARNING) warning_handler.setFormatter(logging.Formatter('%(levelname)s:%(name)s:%(message)s')) # 配置DEBUG级别Handler:只处理DEBUG及以上日志,专门输出堆栈 debug_handler = logging.StreamHandler(debug_output) debug_handler.setLevel(logging.DEBUG) debug_handler.setFormatter(logging.Formatter('%(levelname)s:%(name)s:%(message)s\n%(exc_info)s')) # 绑定Handler到root logger root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) # 全局级别设为最低,确保所有日志能被Handler捕获 root_logger.addHandler(warning_handler) root_logger.addHandler(debug_handler) try: raise RuntimeError('terrible horrible error') except Exception: logging.warning('an exception happened') logging.debug('error occurred here', exc_info=True) # 查看两个流的内容 print("=== WARNING流内容 ===") print(warning_output.getvalue()) print("\n=== DEBUG流内容 ===") print(debug_output.getvalue())
可选:封装自定义快捷方法
如果你想像logging.exception一样简化调用,可以封装一个自定义方法:
def debug_exception(msg, logger=None): target_logger = logger or logging.getLogger() target_logger.debug(msg, exc_info=True) # 使用示例 try: raise RuntimeError('test error') except Exception: debug_exception('debug level exception with traceback')
内容的提问来源于stack exchange,提问作者BadZen
相关产品推荐
相关产品推荐

