前言在线程序报错时,使用python标准库logging记录的日志调试问题是我们常见的操作,但是logging并没有直接为我们提供打印变量值的功能,需要我们显式的写它在日志中,像这样:logger.debug(f'error:{a}')但错误是一个链,而不是一个点。如果到处加上打印语句,工作量就太大了。Python的第三方日志库loguru,可以帮助我们实现这个需求。你想达到下面的效果吗?2022-01-0915:59:52.058|错误|__main__:func:32-预期值:第1行第1列(字符0)回溯(最近调用最后):文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py”,第930行,在_bootstrapself._bootstrap_inner()│└└File"/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py",line973,in_bootstrap_innerself.run()│└└File"/Library/Frameworks/Python.框架/版本/3.9/lib/python3.9/threading.py”,第910行,在运行self._target(*self._args,**self._kwargs)│││││└{}││││└│││(│││<在0x106459450;在0x105fafd30>,<_queue.simplequeue对象at0x1053e88b0>,none,())│文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/concurrent/futures/thread.py”,第77行,在_workerwork_item.run()│└└File"/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/concurrent/futures/thread.py",line52,inrunresult=self.fn(*self.args,**self.kwargs)│││││└{}││││└│││└()││└.│└└>File"/Users/bot/Desktop/code/ideaboom/test_zjwt/test_api_copy.py",line27、在funcassertint(response.json().get('r'))==(a+b)│││└54││└100│└└文件“/Users/bot/.local/share/virtualenvs/ideaboom-8ZWsq-JB/lib/python3.9/site-packages/requests/models.py”,第910行,在json中返回complexjson.loads(self.text,**kwargs)││││└{}│││└<0x105fb24f0处的属性对象>││└│└<函数在0x105c58a60处加载>└文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py”,第346行,在加载返回_default_decoder.decode(s)││└'\n500内部服务器错误\n
InternalServerError...│└└File"/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py",line337,indecodeobj,end=self.raw_decode(s,idx=_w(s,0).end())││││└'\n500内部服务器错误\n内部服务器错误...│││└<0x105c493f0处的re.Pattern对象的内置方法匹配>││└'\n500内部服务器错误\n
内部服务器错误...│└└File"/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py",line355,raw_decoderaiseJSONDecodeError("Expectingvalue",s,err.value)fromNone│└'\n<title>500内部服务器错误\n内部服务器错误...└json.decoder.JSONDecodeError:预期值:第1行第1列(char0)一个使用loguru的简单示例!loguru提供了exception方法打印异常logger.exception()需要一个参数,你可以随便填。我习惯用errorlogger.exception和logger.error是不一样的。前者会做变量跟踪,后者不会显示效果:fromloguruimportloggerdeffunc(a:int,b:int):a/btry:func(0,0)exceptExceptionaserror:logger.exception(error)─?python-u"/Users/bot/Desktop/code/ideaboom/test_logger/003.py"2022-01-0923:44:12.792|错误|__main__::11-除以zeroTraceback(最后一次调用):>文件“/Users/bot/Desktop/code/ideaboom/test_logger/003.py”,第9行,在func(0,0)└文件“/Users/bot/Desktop/code/ideaboom/test_logger/003.py”,第5行,在funca/b中│└0└0ZeroDivisionError:图中被零除从日志显示可以看出,打印了变量a和b的值。链式异常loguru很好地支持链式异常(raise...from...)。如果你不知道什么是异常链,你可以看看Python官方文档——异常链fromloguruimportloggerdeffunc(a:int,b:int):try:a/bexceptExceptionaserror:raiseException('计算错误')fromerrortry:func(0,0)exceptExceptionaserror:logger.exception(error)─?python-u"/Users/bot/Desktop/code/ideaboom/test_logger/003.py"2022-01-0923:43:04.729|错误|__main__::14-计算错误回溯(最近一次调用最后一次):文件“/Users/bot/Desktop/code/ideaboom/test_logger/003.py”,第6行,在funca/b中│└0└0ZeroDivisionError:被零除上述异常是以下异常的直接原因:Traceback(最近调用最后一次):>文件“/Users/bot/Desktop/code/ideaboom/test_logger/003.py”,第12行,在func(0,0)└文件“/Users/bot/Desktop/code/ideaboom/test_logger/003.py”,第8行,funcraiseException('计算错误')fromerror└Exception('计算错误')Exception:计算错误