python loguru logger日志

1,221 阅读4分钟

前言

用Python写代码的时候,在想看的地方写个print(),就能在控制台上显示打印信息,这样子就能知道它是什么了,
但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print()就不大方便了,所以Python引入了loguru模块来记录我想要的信息。
print()也可以输出日志,loguru相对print()来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。

logger中一共有5种级别的消息,分别是:
   DEBUG < INFO < WARNING < ERROR < CRITICAL
   可以在add()函数中指定level的级别,低于指定level级别的消息将不会打印在日志中。
   如果没有指定level级别,则默认会打印所有级别的消息到日志中

安装

pip install loguru 
 

初识

from loguru import logger
logger.debug("This is a debug...")
上面的代码运行结果如下:
  2020-05-03 09:22:35.746 | DEBUG  | __main__:<module>:3 - This is a debug...
可以看到其默认的输出格式中包含:有时间、级别、模块名、行号以及日志信息,不需要手动创建 logger,直接使用即可,另外其输出还是彩色的,高亮,看起来会更加友好。
    
以上的日志信息是直接输出到控制台的,并没有输出到其他的地方,是因为我们没有用add()方法来指定输出位置。
如果想要输出到其他的位置,也就是重定向,比如存在某个文件中,我们只需要使用一行代码声明即可,
一句add()就搞定了。
运行之后就可以在runtime.log里法发现打印的日志信息了。
 from loguru import logger
 logger.add("runtime.log")   # 输出到runtime.log文件中
 logger.debug("This is a debug...")
 logger.warning("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
     )
看add()函数的源码,我们就知道该函数中有这么多的参数,如level,format,filter等
    

3.1/基本参数

基本参数是format,filter,level等
基本的输出格式为:
logger.add('runtime.log', 
           format="{time} {level} {message}", 
           filter="my_module", 
           level="INFO")
以上的意思是:只有info级别的日志才会打入到runtime.log这个文件中,其他级别的日志不会打到这个文件中
当然这可以随意更改的。
        

3.2/删除

另外添加 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
           

3.3/rotation配置

通过add()函数中的rotation参数,我们可以做到:
 <1> 每天(每周)输出一个文件
     logger.add('runtime_{time}.log', rotation="1 day")
     logger.add('runtime_{time}.log', rotation='1 week')
     我们在配置log名字时加上了一个time占位符,这样在生成文件的时候可以自动将时间替换进去,生成一个包含时间的log文件。
 <2> 文件过大,自动分割日志文件
     logger.add('runtime_{time}.log', rotation="500 MB")
     我们在配置log名字时加上了一个time占位符,这样在生成时可以自动将时间替换进去,生成一个包含时间的log文件。
 <3> 定时创建文件
     logger.add('runtime_{time}.log', rotation='00:00')
     这样就可以实现每天 0 点新创建一个 log 文件输出了。
             

3.4/retention

很多情况下,一些非常久远的log文件对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。               
retention 这个参数可以配置日志的最长保留时间。
比如我们想要设置日志文件最长保留 10 天,可以这么来配置:
logger.add('runtime.log', retention='10 days')  # 1 week  3 days  2 months  都可以
          

3.5/compression配置

loguru 还可以配置文件的压缩格式,比如使用 zip 文件格式保存,示例如下:		
logger.add('runtime.log', compression='zip')
可选格式为"gz", "bz2", "xz", "lzma", "tar", "tar.gz", "tar.bz2",“tar.xz", "zip"