这样配置pythonlogging模块,让日志输出更加清晰

云计算分享者 2024-02-24 02:14:01
0x00 python logging模块基本工作流程

logging模块工作流程

上图是官方文档中logging HOWTO中关于python logging模块的工作流程图.

1. 使用logger.info或者类似的方法进行日志输出

2. 每个logger上有一个level,如果日志输出的级别比logger的级别高,那么日志才会输出,比如logger的级别为INFO,那么logger.debug对应的日志就不会输出

3.在确定需要输出日志的情况下,会根据输入创建一个log record. 如果这个logger上面有filter,那么这些filter规则会作用上去,可能会导致一些log record被过滤掉不输出. 一般这个filter都是空的.

4.每个logger上的handler会开始对日志进行真正的输出

4.1 每个handler也有一个LEVEL,作用方式和logger的LEVLE相同,只有日志输出级别比handerl级别高,日志才会输出

4.2 每个handler也有自己的filter,其作用方式和logger的filter相同,会导致一些日志被过滤掉

4.3 handler根据自己的formatter将日志进行输出.

5. 如果logger的propagate属性为True,那么不断遍历logger的parent,并直接调用其hander进行日志输出,parent的level不会被检查,filter也不会被作用.

从上面可以看出,logger的propagate属性很重要,其默认值为True.所以我们就徐亚把共同输出日志handler尽可能向高层级的logger上挂载.

在logging模块中,会有一个默认的root logger,其他的logger需要使用logging.getLogger方法得到.logger的名字也代表了其层级关系,比如logging.getLogger('foo.bar')得到一个名字为foo.bar的logger,其parent为foo,foo的parent为root logger.

0x01 配置formatter和handler

一般我都会给formatter配置输出足够多的信息,方便出问题时直接可以看到各种需要的信息.

常用的日志输出是输出到文件和输出到屏幕(标准输出或者标志错误). 注意输出到文件要使用RotatingFileHandler而不是直接使用FileHandler,避免文件一直增长导致将磁盘占满.

0x02 配置root logger

一般我会给root logger上配置一个RotatingFileHandler和一个StreamHandler,这样所有的日志一定可以在一个文件和屏幕上都可以看到.因为这里面日志最全,文件增长速度也会比较快,可以给RotatingFileHandler配置更多的轮转数和更大的单文件大小

0x03 配置一级logger

对于其他的logger,一般只配置一个RotatingFileHandler,这样对每一个具体的组件,日志会进入一个单独的文件

0x04 配置二级logger

二级logger的和一级logger一样,自己上面挂载一个RotatingFileHandler,这个就有一个单独的文件可以看自己的日志,而且自己的日志同时也会出现在对应的一级logger里面.

0x05 测试日志输出

我们测试一下在log和log1上分别输出一条日志

可以看到,log1上输出的日志在module1.log,my_project.log,all.log以及屏幕上都输出了.

其中module1.log中输出的内容是在my_project.module1上的handler输出的,my_project.log中输出的内容是my_project上的handler输出的,all.log和屏幕上输出的是root logger上的hander输出的. 而log上的日志只在my_project.log,all.log以及屏幕上输出.

0xff 总结

一般在python中进行日志输出我们都是直接使用logging模块,这个模块的功能十分强大.文章中介绍的logger,handler,formatter配置,在大部分的场景下基本够用了.其他有特殊要求的场景可以更加细化.

0 阅读:0

云计算分享者

简介:感谢大家的关注