作者:小张学Python
本文链接: https://mp.weixin.qq.com/s/dkNkEohPl6H2VopUrpxxZg
转载请注明来源!!

前言

在做项目的时候一直在用Python自带的模块logging,进行日志的记录,虽然他们满足我大部分的要求,但是还是有很多缺点,例如需要额外的配置、不能自动删除时间久的日志文件等等。

难道真的没有比较好的第三方模块吗。。。。。于是我在网上langlanglang.....咦?还真到了一个比较好的模块来记录日志。他就是今天我们的主角---loguru!!

一、安装loguru

pip install loguru

  

二、基本使用

from loguru import loggerlogger.debug('this is a debug message')

运行结果如下:

从结果可以得知,不需要配置什么东西,然后调用其 debug方法即可。在 loguru 里面有且仅有一个主要对象,那就是 logger.loguru 里面有且仅有一个 logger,而且它已经被提前配置了一些基础信息,比如比较友好的格式化、文本颜色信息等等。

三、详细使用

既然是日志,那么最常见的就是输出到文件了。loguru 对输出到文件的配置有非常强大的支持,比如支持输出到多个文件,分级别分别输出,过大创建新文件,过久自动删除等等。下面我们分别看看这些怎样来实现,这里基本上就是 add 方法的使用介绍。

1.输出日志到文件,记录日志的等级,编码格式

import os
from loguru import logger
# logger.debug('this is a debug message')
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志文件配置
LOG_DIR = os.path.join(BASE_DIR,'log')
if os.path.exists(LOG_DIR) is False:
os.makedirs(LOG_DIR)
logger.add(os.path.join(LOG_DIR,'error.log'),encoding='utf-8',level="INFO")

  

2.rotation 配置

用了 loguru 我们还可以非常方便地使用rotation 配置,比如我们想一天输出一个日志文件,或者文件太大了自动分隔日志文件,我们可以直接使用 add 方法的 rotation 参数进行配置

#输出到文件"error2020-09-21_16-08-52_714738.log",
logger.add(os.path.join(LOG_DIR,'error{time}.log'),rotation="500 MB",level="WARNING",encoding='utf-8')

通过这样的配置我们就可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个 log 文件。

我们在配置 log 名字时加上了一个 time 占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。

另外我们也可以使用 rotation 参数实现定时创建 log 文件,例如:

logger.add('runtime_{time}.log', rotation='00:00') #实现每天 0 点新创建一个 log 文件输出了。

  

另外我们也可以配置 log 文件的循环时间,比如每隔一周创建一个 log 文件,写法如下:

logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 week',encoding='utf-8') #实现 1 day 1 week 1 hour 即多久生成一个新的文件

  

3.retention 配置

很多情况下,一些非常久远的 log 对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。retention 这个参数可以配置日志的最长保留时间。

logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day',retention='30 days',encoding='utf-8')

  

这样log 文件里面就会保留最新 30 天的, log会自动清理一个月之前的日志

4.compression 配置

loguru 还可以配置文件的压缩格式,这样可以更加节省存储空间,比如使用 zip 文件格式保存,示例如下:

logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day', compression='zip',retention='30 days',encoding='utf-8')

  

5.enqueue配置

loguru可以配置在多进程同时往日志文件写日志的时候使用队列达到异步功效。

logger.add(os.path.join(LOG_DIR,'error.log'), enqueue=True)  # 异步写入

  

6.Traceback 记录

在很多情况下,如果遇到运行错误,而我们在打印输出 log 的时候万一不小心没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。

但用了 loguru 之后,我们用它提供的装饰器就可以直接进行 Traceback 的记录,例如:

import os
from loguru import logger
# logger.debug('this is a debug message') BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志文件配置
LOG_DIR = os.path.join(BASE_DIR,'log') if os.path.exists(LOG_DIR) is False:
os.makedirs(LOG_DIR)
logger.add(os.path.join(LOG_DIR,'error.log'),rotation='1 day',retention='30 days',encoding='utf-8',level="INFO")
@logger.catch
def func():
print(a) func()
logger.warning("程序走到这里了")

  

 

error.log日志文件如下:

2020-09-24 16:50:58.398 | ERROR    | __main__:<module>:17 - An error has been caught in function '<module>', process 'MainProcess' (42920), thread 'MainThread' (42252):
Traceback (most recent call last):
> File "D:/project/loguru_demo.py", line 17, in <module>
func()
└ <function func at 0x00000261BF734268>
File "D:/project/loguru_demo.py", line 15, in func
print(a)
NameError: name 'a' is not defined
2020-09-24 16:50:58.792 | WARNING | __main__:<module>:18 - 程序走到这里了

  

很明显,程序的报错位置追踪到了,也没有影响程序接下来的正常运行。

四、结语

到这之后呢,已将loguru记录日志的方法已经基本介绍完毕,具体详细的课查看官方网站==>>官方文档:

 创作不易,期待你的打赏!!

Python记录日志模块推荐-loguru!的更多相关文章

  1. Python分词模块推荐:jieba中文分词

    一.结巴中文分词采用的算法 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合对于未登录词,采 ...

  2. python模块 - 常用模块推荐

    http://blog.csdn.net/pipisorry/article/details/47185795 python常用模块 压缩字符 当谈起压缩时我们通常想到文件,比如ZIP结构.在Pyth ...

  3. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  4. python基础-模块

    一.模块介绍                                                                                              ...

  5. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

  6. python 常用模块(转载)

    转载地址:http://codeweblog.com/python-%e5%b8%b8%e7%94%a8%e6%a8%a1%e5%9d%97/ adodb:我们领导推荐的数据库连接组件bsddb3:B ...

  7. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  8. 如何制作python安装模块(setup.py)

    Python模块的安装方法: 1. 单文件模块:直接把文件拷贝到$python_dir/lib 2. 多文件模块,带setup.py:python setup.py install 3. egg文件, ...

  9. Python 日志模块实例

    python 打印对象的所有属性值: def prn_obj(obj):     print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...

随机推荐

  1. Linux系统环境下MySQL数据库源代码的安装

    Linux系统环境下MySQL数据库源代码的安装 基本环境:CentOS Linux release 7.8.2003 (Core).MySQL5.6 一.      安装环境准备 若要在Linux系 ...

  2. .NET 设计模式 思维导图

    关于.NET 设计模式 思维导图 背景说明 以前都在匆匆忙忙写代码,在无穷无尽的需求中间左冲右突,最近终于有一些闲暇的时间,来总结和思考编程中的一些核心思想,磨刀不误砍柴的功夫,期望通过总结和学习,能 ...

  3. 《Head First 设计模式》:外观模式

    正文 一.定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 要点: 外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外 ...

  4. ent orm笔记2---schema使用(上)

    在上一篇关于快速使用ent orm的笔记中,我们再最开始使用entc init User 创建schema,在ent orm 中的schema 其实就是数据库模型,在schema中我们可以通过Fiel ...

  5. new操作符创建对象的四个步骤

    new操作符创建对象可以分为以下四个步骤: 创建一个空对象 将所创建对象的__proto__属性值设为构造函数的prototype的属性值 执行构造函数中的代码,构造函数中的this指向该对象 返回对 ...

  6. 从零开始的SpringBoot项目 ( 七 ) 统一返回结果集Result 和 异常处理

    import java.io.Serializable; import lombok.Data; import org.springframework.http.HttpStatus; @Data p ...

  7. Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

    YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...

  8. Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)

    论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...

  9. Stack (30)(模拟栈,输出中间数用set)

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  10. Codeforces 1337D Xenia and Colorful Gems

    题意 给你3个数组\(a, b\)和\(c\),最小化\((x-y)^2+(y-z)^2+(z-x)^2\),其中\(x \in a, y \in b, z \in c\). 解题思路 这题其实第一眼 ...