前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中日志记录新技能

Python中日志记录新技能

原创
作者头像
追风骚年
发布2021-11-19 11:38:24
7311
发布2021-11-19 11:38:24
举报
文章被收录于专栏:用户9197876的专栏

导语 不断学习,持续进化,get日志记录新技能

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

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

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

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

2、安装

3、快速使用

4、高阶用法简介

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

logging

loguru

相同

提供简洁、灵活地事件记录功能

不同

需要显式实例化logger,并使用Handler,Formatte,Filter

减少配置步骤,add函数统治所有

二、安装

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

pip3 install loguru

三、快速使用

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

代码语言:txt
复制
from loguru import logger

logger.debug("This is Debug")

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

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

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

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

四、高阶用法简介

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

代码语言:txt
复制
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)可以是一个类或方法

下面我们就试试吧

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

代码语言:txt
复制
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.

代码语言:txt
复制
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")   # 每周创建新文件

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

代码语言:txt
复制
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参数中设置

代码语言:txt
复制
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记录

代码语言:txt
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、与logging区别,为什么loguru“香”
  • 二、安装
  • 三、快速使用
  • 四、高阶用法简介
    • (一)保存输出日志到文件
      • (二)支持日志大小分割、日志保留时间定义
      • 按日志大小、时间(小时、周)创建
      • 配置日志保留最长时间
        • (三)支持日志时间自定义
          • (四)支持代码异常追踪
            • 1、在add参数中设置
            • 2、使用装饰器直接Traceback记录
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档