下图描述了日志流的处理流程:
日志处理流程:
1. (在用户代码中进行)日志记录函数调用,如:logger.info(...),logger.debug(...)等;
2. 判断要记录的日志级别是否满足日志器设置的级别要求,如果不满足则该日志记录会被丢弃并终止后续的操作,如果满足则继续下一步操作;
3. 根据日志记录函数调用时掺入的参数,创建一个日志记录(LogRecord类)对象;
4. 判断日志记录器上设置的过滤器是否拒绝这条日志记录,如果日志记录器上的某个过滤器拒绝,则该日志记录会被丢弃并终止后续的操作,如果日志记录器上设置的过滤器不拒绝这条日志记录或者日志记录器上没有设置过滤器则继续下一步操作--将日志记录分别交给该日志器上添加的各个处理器;
5. 判断要记录的日志级别是否满足处理器设置的级别要求(要记录的日志级别要大于或等于该处理器设置的日志级别才算满足要求),如果不满足记录将会被该处理器丢弃并终止后续的操作,如果满足则继续下一步操作
6. 判断该处理器上设置的过滤器是否拒绝这条日志记录,如果该处理器上的某个过滤器拒绝,则该日志记录会被当前处理器丢弃并终止后续的操作,如果当前处理器上设置的过滤器不拒绝这条日志记录或当前处理器上没有设置过滤器测继续下一步操作;
7. 如果能到这一步,说明这条日志记录经过了层层关卡允许被输出了,此时当前处理器会根据自身被设置的格式器(如果没有设置则使用默认格式)将这条日志记录进行格式化,最后将格式化后的结果输出到指定位置(文件、网络、类文件的Stream等)
8. 如果日志器被设置了多个处理器的话,上面的第5-8步会执行多次;
9. 这里才是完整流程的最后一步:判断该日志器输出的日志消息是否需要传递给上一级logger(之前提到过,日志器是有层级关系的)的处理器,如果propagate属性值为1则表示日志消息将会被输出到处理器指定的位置,同时还会被传递给parent日志器的handlers进行处理直到当前日志器的propagate属性为0停止,如果propagate值为0则表示不向parent日志器的handlers传递该消息,到此结束。
可见,一条日志信息要想被最终输出,需要依次经过以下几次过滤:
- 日志器等级过滤;
- 日志器的过滤器过滤;
- 日志器的处理器等级过滤;
- 日志器的处理器的过滤器过滤;
参考文档: https://www.cnblogs.com/yyds/p/6901864.html