日志框架logback <root level="info">

1,710 阅读2分钟

目的

  • 理解日志系统
  • 理解配置文件中标签的含义
  • 理解root标签中的level到底是干啥的

正文

logback做为一个日志系统,它是log4j作者在log4j的基础上开发的框架,比log4j性能更高。logback实现了SEL4J规范(就是一套接口),使得其更加具有通用性。 spring框架中的日志系统就是使用的SEL4J规范,所有实现了SEL4J规范的日志系统都可以无缝替换,spring中默认使用的是logback,好了这些都不重要,开始我们的正文

image.png

配置文件中一般都有这么几个标签Logger,Appender... 还有一个root

logback中是以logger作为主体,logger中有其所引用的appender,可以将logger理解为日志打印器,appender理解为一个封装了日志输出的格式以及位置的对象

当我们调用logger.info()方法的时候,就是logger通过调用其内部引用的appender来实现打印(打印到控制台或文件中),大致的一个工作逻辑就是这样的,接下来我们略微详细的说一下日志打印的过程

logger的结构

在系统中logger与logger之间是以树状结构(父子关系)进行关联的,最顶层的logger其名称为root(对应到我们配置文件中就是root标签,这里就明白了root也是一个logger只不过它比较特殊是最顶层的那个logger),logger与logger的父子关系是通过(.)和($)来关联的,例如a是a.b的父级

image.png

image.png

image.png

logger中引用着appender,root中默认有一个输出到控制台的appender

image.png

调用loger.info()

第一步:判断当前logger对象的level是否达到了info级别,如果没有则结束方法调用
第二步:拿到当前logger对象引用的appender对象集合,依次调用
第三步:获取到当前logger对象的父级对象,循环调用父级对象引用的appender集合
       appender也有着自己的level,在输出之前也会判断是否符合level
第四步:然后再获取父级,直到父级对象为空结束

image.png

image.png

总结

现在我们理解了日志的大致流程,并且也搞懂了一个我一直不理解的东西就是理解root标签中的level到底是干啥的,现在理解了,它只是用来设置根logger的等级的

假设root设置了level为error
demoLogger设置了level为info,并且不为demoLogger设置appender
使用demoLogger调用info方法,日志会不会打印?

答案是会的
日志打印的流程是先判断logger的level,而demoLogger的level是允许打印info级别的
然后调用appender执行,然后再调用父级的appender执行,这期间并不会判断父级的level是否允许

image.png 参考文档: logback官网手册