python之日志记录loguru
安装:
pip install loguru
基础使用:
from loguru import logger logger.debug("This is a debug...")
在 loguru
里面有且仅有一个主要对象,那就是 logger
,loguru
里面有且仅有一个 logger
,而且它已经被提前配置了一些基础信息,比如比较友好的格式化、文本颜色信息等等。
运行结果:
可以看到其默认的输出格式是上面的内容,有时间、级别、模块名、行号以及日志信息,不需要手动创建 logger
,直接使用即可,另外其输出还是彩色的,看起来会更加友好。
以上的日志信息是直接输出到控制台的,并没有输出到其他的地方,如果想要输出到其他的位置,比如存为文件,我们只需要使用一行代码声明即可。
例如将结果同时输出到一个 runtime.log
文件里面,可以这么写:
from loguru import logger logger.add("runtime.log")
logger.debug("This is a debug...")
logger.warning("This is a debug...")
一行 add
语句搞定,运行之后会发现目录下 runtime.log
里面同样出现了刚刚控制台输出的 DEBUG
信息。
2020-05-03 09:26:09.212 | DEBUG | __main__:<module>:4 - This is a debug...
2020-05-03 09:26:09.212 | WARNING | __main__:<module>:5 - This is a debug...
使用:
既然是日志,那么最常见的就是输出到文件了。loguru
对输出到文件的配置有非常强大的支持,比如支持输出到多个文件,分级别分别输出,过大创建新文件,过久自动删除等等。
下面我们分别看看这些怎样来实现,这里基本上就是 add
方法的使用介绍。因为这个 add
方法就相当于给 logger
添加了一个 Handler
,它给我们暴露了许多参数来实现 Handler
的配置,下面我们来详细介绍下。
首先看看它的方法定义吧:
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
)
看看它的源代码,它支持这么多的参数,如 level
、format
、filter
、color
等等,另外我们还注意到它有个非常重要的参数 sink
,我们看看官方文档:sink,可以了解到通过 sink
我们可以传入多种不同的数据结构,汇总如下:
sink
可以传入一个file
对象,例如sys.stderr
或者open('file.log', 'w')
都可以。sink
可以直接传入一个str
字符串或者pathlib.Path
对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志输出进去。sink
可以是一个方法,可以自行定义输出实现。sink
可以是一个logging
模块的Handler
,比如FileHandler
、StreamHandler
等等,或者上文中我们提到的CMRESHandler
照样也是可以的,这样就可以实现自定义Handler
的配置。sink
还可以是一个自定义的类,具体的实现规范可以参见官方文档。
另外添加 sink
之后我们也可以对其进行删除,相当于重新刷新并写入新的内容。
删除的时候根据刚刚 add
方法返回的 id
进行删除即可,看下面的例子:
from loguru import logger trace = logger.add('runtime.log')
logger.debug('this is a debug message')
logger.remove(trace)
logger.debug('this is another debug message')
看这里,我们首先 add
了一个 sink
,然后获取它的返回值,赋值为 trace
。随后输出了一条日志,然后将 trace
变量传给remove
方法,再次输出一条日志,看看结果是怎样的。
最终结果:
控制台输出如下:
2020-05-03 09:55:11.005 | DEBUG | __main__:<module>:4 - this is a debug message
2020-05-03 09:55:11.005 | DEBUG | __main__:<module>:6 - this is another debug message 日志文件 runtime.log 内容如下:
2020-05-03 09:55:11.005 | DEBUG | __main__:<module>:4 - this is a debug message
可以发现,在调用 remove
方法之后,确实将历史 log
删除了。
这样我们就可以实现日志的刷新重新写入操作。
rotation配置
用了 loguru
我们还可以非常方便地使用rotation
配置,比如我们想一天输出一个日志文件,或者文件太大了自动分隔日志文件,我们可以直接使用 add
方法的 rotation
参数进行配置。
我们看看下面的例子:
logger.add('runtime_{time}.log', rotation="500 MB")
通过这样的配置我们就可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个 log 文件。我们在配置 log 名字时加上了一个 time
占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。
另外我们也可以使用 rotation
参数实现定时创建 log 文件,例如:
logger.add('runtime_{time}.log', rotation='00:00')
这样就可以实现每天 0 点新创建一个 log 文件输出了。
另外我们也可以配置 log 文件的循环时间,比如每隔一周创建一个 log 文件,写法如下:
logger.add('runtime_{time}.log', rotation='1 week')
这样我们就可以实现一周创建一个 log 文件了。
retention 配置
很多情况下,一些非常久远的 log 对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。retention
这个参数可以配置日志的最长保留时间。
比如我们想要设置日志文件最长保留 10 天,可以这么来配置:
logger.add('runtime.log', retention='10 days')
compression配置
loguru
还可以配置文件的压缩格式,比如使用 zip
文件格式保存,示例如下:
logger.add('runtime.log', compression='zip')
可选格式为"gz"
, "bz2"
, "xz"
, "lzma"
, "tar"
, "tar.gz"
, "tar.bz2"
,"tar.xz"
, "zip"
enqueue配置
loguru
可以配置在多进程同时往日志文件写日志的时候使用队列达到异步功效。
logger.add("somefile.log", enqueue=True) # 异步写入
要记录的消息是否应该在到达接收器之前首先通过一个多进程安全的队列。这在通过多个进程记录文件时非常有用。
字符串格式化
loguru
在输出 log 的时候还提供了非常友好的字符串格式化功能,像这样:
logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings') 输出:
2020-05-03 10:24:34.200 | INFO | __main__:<module>:3 - If you are using Python 3.6, prefer f-strings of course!
Traceback 记录
在很多情况下,如果遇到运行错误,而我们在打印输出 log 的时候万一不小心没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。
但用了 loguru
之后,我们用它提供的装饰器就可以直接进行 Traceback 的记录,类似这样的配置即可:
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)
python之日志记录loguru的更多相关文章
- Python的日志记录-logging模块的使用
一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...
- [ Python入门教程 ] Python中日志记录模块logging使用实例
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
- Python 第三方日志框架loguru使用
解决中文乱码问题 项目地址 github: https://github.com/Delgan/loguru 文档:https://loguru.readthedocs.io/en/stable/in ...
- python错误日志记录工具,解决项目排错问题
我们写项目的时候难免会遇到代码报错的问题,遇到这样的问题了如何快速的定位问题并解决问题呢? 我今天来整理了利用python只带的工具来解决这个问题,我能需要使用的库有: logging os 这些都是 ...
- Beats:使用 Elastic Stack 记录 Python 应用日志
文章转载自:https://elasticstack.blog.csdn.net/article/details/112259500 日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技 ...
- [编程基础] Python日志记录库logging总结
Python日志记录教程展示了如何使用日志记录模块在Python中进行日志记录. 文章目录 1 介绍 1.1 背景 1.2 Python日志记录模块 1.3 根记录器 2 Python logging ...
- python标准日志模块logging及日志系统设计
最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...
- python标准日志模块logging的使用方法
参考地址 最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下.python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果 ...
- 【python】日志系统
来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...
- Python - loguru日志库,高效输出控制台日志和日志记录
一.安装loguru loguru的PyPI地址为:https://pypi.org/project/loguru/ GitHub仓库地址为:https://github.com/Delgan/log ...
随机推荐
- 自己服务器搭建docker组和环境
1. docker 当然首先安装一下docker,具体怎么 安装,网上搜一下.我用的ubuntu20系统,就是安装一个普通的软件的操作.安装后,运行一下docker run hello-world,运 ...
- ASP.NET Core – Upload and Download Files (上传和下载文件)
前言 以前得文章 Asp.net core 学习笔记 ( upload/download files 文件上传与下载 ), 这篇是修订版. Handle Upload File (处理上传文件) 我的 ...
- TypeScript – Decorator 装饰器
前言 TypeScript 5.0 之后就可以使用正真的 JS Decorator 了, 从前 experiment 的版本依然可用, 但是不建议继续用, 因为差很远, 一起用会混乱. Decorat ...
- SQL Server STRING_AGG
参考: How To Use STRING_AGG – Concat Multiple Row Values In SQL Server 如果你想做 string.join(',', collecti ...
- 课时05:Linux必备系统命令
- Linux 防火墙与安全管理工具详解
Linux 防火墙与安全管理工具详解 1. Iptables 概述 Iptables 是 Linux 系统中用于控制网络流量的工具,通过定义规则来过滤.转发和修改数据包.其规则可以细致地管理进入和离开 ...
- SXYZ-6.26模拟赛
没有爆零,足矣. 发现绍兴一中机房的一个特点:键盘打得贼响!! T1 ctrl 啃臭键在哪里 (中文名我都不好意思大打) 第一遍测T1一分都没得啊! 这跟题目描述自相矛盾有关,导致我只是轻微考虑了一下 ...
- 深入理解 Nuxt.js 中的 app:error:cleared 钩子
title: 深入理解 Nuxt.js 中的 app:error:cleared 钩子 date: 2024/9/28 updated: 2024/9/28 author: cmdragon exce ...
- USB3.0与USB2.0编码方式的区别
首先,USB3.0传输的编码方式和USB2.0本质上是不同的. 1.USB3.0的编码方式 USB 3.0采用的是8b/10b编码方式,由于高速传输,信号干扰的问题,USB 3.0采用 8/10bit ...
- Linux调度器:进程优先级
一.前言 本文主要描述的是进程优先级这个概念.从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级.realtime优先级.归一化优先级 ...