当前位置 : 主页 > 编程语言 > python >

python之日志记录loguru

来源:互联网 收集:自由互联 发布时间:2022-06-15
安装: pip install loguru 基础使用: from loguru import logger logger.debug("This is a debug...") 在​​loguru​​​里面有且仅有一个主要对象,那就是​​logger​​​,​​loguru​​​里面有且仅有一

 

安装:

  

pip install loguru

 

基础使用:

from loguru import logger

logger.debug("This is a debug...")

在 ​​loguru​​​ 里面有且仅有一个主要对象,那就是 ​​logger​​​,​​loguru​​​ 里面有且仅有一个 ​​logger​​,而且它已经被提前配置了一些基础信息,比如比较友好的格式化、文本颜色信息等等。

 

运行结果:

python之日志记录loguru_python

 

 

可以看到其默认的输出格式是上面的内容,有时间、级别、模块名、行号以及日志信息,不需要手动创建 ​​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__::4 - This is a debug...
2020-05-03 09:26:09.212 | WARNING | __main__::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__::4 - this is a debug message
2020-05-03 09:55:11.005 | DEBUG | __main__::6 - this is another debug message

日志文件 runtime.log 内容如下:
2020-05-03 09:55:11.005 | DEBUG | __main__::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__::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之environs
下一篇:没有了
网友评论