python 使用 loguru 输出异常日志同时打印变量值

前言

线上的程序报错的时候,使用 python 的标准库 logging 记录的日志 debug 问题,是我们常用的操作,但是 logging 没有直接提供给我们打印变量值的功能,这个需要我们显性的写在日志中,就像这样: logger.debug(f'error: {a}')

但是错误是一个链条,不是一个点,如果在每处都加上打印语句的话,工作量太大了

python 的第三方日志库 loguru ,可以很好的帮助我们实现这个需求

效果展示

你想要实现下面的效果吗?

2022-01-09 15:59:52.058 | ERROR    | __main__:func:32 - Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):

  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 930, in _bootstrap
    self._bootstrap_inner()
    │    └ 
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
    │    └ 
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
    │    │        │    │        │    └ {}
    │    │        │    │        └ 
    │    │        │    └ (, <_queue.SimpleQueue object at 0x1053e88b0>, None, ())
    │    │        └ 
    │    └ 
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/concurrent/futures/thread.py", line 77, in _worker
    work_item.run()
    │         └ 
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/concurrent/futures/thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
             │    │   │    │       │    └ {}
             │    │   │    │       └ 
             │    │   │    └ ()
             │    │   └ 
             │    └ 

> File "/Users/bot/Desktop/code/ideaboom/test_zjwt/test_api_copy.py", line 27, in func
    assert int(response.json().get('r')) == (a+b)
               │        │                    │ └ 54
               │        │                    └ 100
               │        └ 

  File "/Users/bot/.local/share/virtualenvs/ideaboom-8ZWsq-JB/lib/python3.9/site-packages/requests/models.py", line 910, in json
    return complexjson.loads(self.text, **kwargs)
           │           │     │    │       └ {}
           │           │     │    └ 
           │           │     └ 
           │           └ 
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           │                │      └ '\n500 Internal Server Error\n

Internal Server Error... │ └ File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) │ │ │ │ └ '\n500 Internal Server Error\n

Internal Server Error... │ │ │ └ │ │ └ '\n500 Internal Server Error\n

Internal Server Error... │ └ File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None │ └ '\n500 Internal Server Error\n

Internal Server Error... └ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

python 使用 loguru 输出异常日志同时打印变量值_第1张图片

一个简单的例子

使用 loguru 吧!

loguru 提供了 exception 方法来打印异常
logger.exception() 需要一个参数,随便填什么都可以,我习惯用 error

logger.exceptionlogger.error 不一样。前者会做变量跟踪,但是后者不会

效果展示:

from loguru import logger


def func(a: int, b: int):
    a/b


try:
    func(0, 0)
except Exception as error:
    logger.exception(error)

    
─➤  python -u "/Users/bot/Desktop/code/ideaboom/test_logger/003.py"
2022-01-09 23:44:12.792 | ERROR    | __main__::11 - division by zero
Traceback (most recent call last):

> File "/Users/bot/Desktop/code/ideaboom/test_logger/003.py", line 9, in 
    func(0, 0)
    └ 

  File "/Users/bot/Desktop/code/ideaboom/test_logger/003.py", line 5, in func
    a/b
    │ └ 0
    └ 0

ZeroDivisionError: division by zero

从图中可以看到,日志展示时候,打印了变量 ab 的值
python 使用 loguru 输出异常日志同时打印变量值_第2张图片

链式异常

loguru 对链式异常的支持也很好

如果你不知道什么是异常链,可以看 Python 官方文档——异常链
from loguru import logger


def func(a: int, b: int):
    try:
        a/b
    except Exception as error:
        raise Exception('计算错误') from error


try:
    func(0, 0)
except Exception as error:
    logger.exception(error)
    
─➤  python -u "/Users/bot/Desktop/code/ideaboom/test_logger/003.py"
2022-01-09 23:43:04.729 | ERROR    | __main__::14 - 计算错误
Traceback (most recent call last):

  File "/Users/bot/Desktop/code/ideaboom/test_logger/003.py", line 6, in func
    a/b
    │ └ 0
    └ 0

ZeroDivisionError: division by zero


The above exception was the direct cause of the following exception:


Traceback (most recent call last):

> File "/Users/bot/Desktop/code/ideaboom/test_logger/003.py", line 12, in 
    func(0, 0)
    └ 

  File "/Users/bot/Desktop/code/ideaboom/test_logger/003.py", line 8, in func
    raise Exception('计算错误') from error
                                 └ Exception('计算错误')

Exception: 计算错误

python 使用 loguru 输出异常日志同时打印变量值_第3张图片

你可能感兴趣的:(python)