3

Python 中日志记录新技能

 2 years ago
source link: https://zhuanlan.zhihu.com/p/436603775
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python 中日志记录新技能

已认证的官方帐号

作者:seanmu,腾讯 CSIG 系统测试工程师

一般情况下我们记录日志经常用到的是 logging 模块,在使用前我们需要配置模板,设置 Handler、Formatter 来预处理,例如日志输出位置、输出格式、日志分块和备份等。在不同项目使用日志时,前期需要进行 logger 的配置工作,相比较今天 get 的新技能个人感觉配置较繁琐。

新技能就是“Delgan/loguru”,Loguru is a library which aims to bring enjoyable logging in Python.

本篇我们从四方面介绍 Loguru:

1、与 logging 区别,为什么 loguru“香”

3、快速使用

4、高阶用法简介

一、与 logging 区别,为什么 loguru“香”

​loggingloguru相同提供简洁、灵活地事件记录功能不同需要显式实例化logger,并使用Handler,Formatte,Filter减少配置步骤,add函数统治所有

二、安装

老规矩,第一步安装库,在 python3 环境下,直接 pip3 安装即可:

pip3 install loguru

v2-df440e9d38bb1e07652d514855f82599_720w.jpg

三、快速使用

安装成功之后,我们就可以开始啦

from loguru import logger

logger.debug("This is Debug")

不需要繁琐的配置,开箱即“食”,so easy

loguru 中主要对象就是 logger,有且只有 loguru,为何不需要配置就可使用呢,那是因为这些配置已经前置啦,输出格式化,文本颜色等,控制台输出如下:

输出内容包括时间、级别、模块名、行号以及日志信息,另外其输出还是彩色的,看起来会更加友(xuan)好(ku)

那如何 DIY 个性化定制专属日志呢,我们看看下一章吧

四、高阶用法简介

我们主要看看 loguru.logger 的“万能”add()

def add(
        self,
        sink,
        *,
        level=_defaults.LOGURU_LEVEL,
        format=_defaults.LOGURU_FORMAT,
        filter=_defaults.LOGURU_FILTER,
        colorize=_defaults.LOGURU_COLORIZE,
        serialize=_defaults.LOGURU_SERIALIZE,
        backtrace=_defaults.LOGURU_BACKTRACE,
        diagnose=_defaults.LOGURU_DIAGNOSE,
        enqueue=_defaults.LOGURU_ENQUEUE,
        catch=_defaults.LOGURU_CATCH,
        **kwargs
    ):
  pass

从源码中可以看出,add 参数很多,如 level、format、filter、color 等等,我们重点看看 sink 参数

sink : |file-like object|_, |str|, |Path|, |callable|_, |coroutine function|_ or |Handler|

An object in charge of receiving formatted logging messages and propagating them to an

appropriate endpoint.

(1)支持 file 对象

(2)可以直接传入一个 str 字符串或者 pathlib.Path 对象

(3)可以是一个 logging 模块中的 Handler

(4)可以是一个类或方法

下面我们就试试吧

(一)保存输出日志到文件

from loguru import logger

logger.add("test_loguru_{time}.log")  # 在add定义输出的文件名

logger.debug("This is Debug")

控制台输出

文件输出到当前工程目录下

(二)支持日志大小分割、日志保留时间定义

按日志大小、时间(小时、周)创建

rotation : |str|, |int|, |time|, |timedelta| or |callable|_, optional

A condition indicating whenever the current logged file should be closed and a new one

started.

配置日志保留最长时间

retention : |str|, |int|, |timedelta| or |callable|_, optional

A directive filtering old files that should be removed during rotation or end of

program.

from loguru import logger

logger.add("test_loguru_{time}.log", rotation="1MB")   # 每个文件大小1MB.超过创建新文件

logger.add("test_loguru_{time}.log", rotation="12:00 ")   # 每天12点创建新文件

logger.add("test_loguru_{time}.log", rotation="1 week")   # 每周创建新文件

(三)支持日志时间自定义

from loguru import logger

logger.add("test_loguru_{time}.log", format="{time:YYYY-MM-DD A HH:mm:ss.SSSS} | {level} | {name} | {message}",level="DEBUG", rotation="500MB", retention="1 days")

logger.info("This is INFO")

(四)支持代码异常追踪

backtrace (bool, optional) – Whether the exception trace formatted should be extended upward, beyond the catching point, to show the full stacktrace which generated the error.

diagnose (bool, optional) – Whether the exception trace should display the variables values to eases the debugging. This should be set to False in production to avoid leaking sensitive data.

1、在 add 参数中设置

from loguru import logger

logger.add("test_loguru_{time}.log", format="{time} | {level} | {name} | {message}", level="DEBUG",
           rotation="1 KB", retention="10 seconds", encoding="utf-8", backtrace=True, diagnose=True)


def test(num_list):
    try:
        for num in num_list:
            logger.info(f"This Number is " + num)
    except Exception as e:
        logger.exception(e)


if __name__ == "__main__":
    l = [1, 2, 3]
    test(num_list=l)

控制台输出

日志文件内容

2、使用装饰器直接 Traceback 记录

from loguru import logger

logger.add("test_loguru_{time}.log", format="{time} | {level} | {name} | {message}", level="DEBUG",
           rotation="1 KB", retention="10 seconds", encoding="utf-8")


@logger.catch
def test(num_list):
    for num in num_list:
        logger.info(f"This Number is " + num)


if __name__ == "__main__":
    l = [1, 2, 3]
    test(num_list=l)

控制台输出

至此,我们可以看出 Loguru 是很强大的,应用简洁,调试追踪直观,当然它还有很多强大功能,大家可以前往官网学习哈

参考资料:

github:https://github.com/Delgan/loguru

loguru 帮助手册:https://loguru.readthedocs.io/en/stable/index.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK