rootlogger 和 logger的关系

你是不是经常看到日志框架(log4j、log4j2、logback等)配置文件中有类似配置,但是始终搞不清楚啥意思?

    

1,首先搞清楚这里的logger指的是什么?

就是咱们在java代码中创建的logger对象,如下:

Logger log = LoggerFactory.getLogger(App.class);

logger的name有两种指定方式,源码如下:

推荐使用传入当前类型的方式(使用全限定名作为logger的name),因为这种方式能使所有的logger形成一棵树,当然自己传入字符串作为logger的name也可以形成一棵树,只不过相对麻烦,具体看下面说明。

2. logger之间是怎么形成一棵树的

通过logger的name。

假设在com.aa包中有A1.class和A2.class, 在com.bb包中有B1.class和B2.class,在com.aa.user包中AUser.class。

A1.class中创建logger:

Logger logger = LoggerFactory.getLogger(A1.class);

A2.class中创建logger:

Logger logger = LoggerFactory.getLogger(A2.class);

B1.class中创建logger:

Logger logger = LoggerFactory.getLogger(B1.class);

B2.class中创建logger:

Logger logger = LoggerFactory.getLogger(B2.class);

AUser.class中创建logger:

Logger logger = LoggerFactory.getLogger(AUser.class);

那么这几个logger就通过name形成了一定关系,简图如下(蓝色的是目录,绿色的logger):

形成树之后有什么好处?

因为子节点会继承父节点的属性值(如日志级别、appender、日志格式等),所以可以方便批量的控制和管理logger,而root logger相当于树根,可用来做默认配置,比如rootlogger的日志级别设置为INFO,那么下面所有logger的日志级别都是INFO,除非针对某个logger设定它自己的级别,举几个例子如下:

1.设定com.aa包及其子包下的所有logger的日志级别为INFO,使用配置如下:

2.设定com.aa.user包及其子包下的所有logger的日志级别为ERROR,使用配置如下:

3.设定com.bb包及其子包下的所有logger的日志级别为DEBUG,使用配置如下:

4.设定所有日志只输出到控制台,但com.bb包及其子包下的所有logger不光要输出到控制台,还要输出到log文件中:

     %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n${CATALINA_BASE}/collie.%d{yyyyMMdd}.log30%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

3.总结

① 配置文件中logger标签的name并不是瞎写的,而是要在代码中确实存在的,否则没有任何效果

② 用类型作为logger的name,本质就是使用类的全限定名作为name,它本身就具有树形结构,所以创建logger时推荐使用类型作为入参,自己传入的字符串很难形成树形结构且不好维护

③ logger之间形成树,且子会继承父的属性,如果不想继承,可增加additivity="false"属性,如下:

④ 所有日志框架的基本套路: 有 logger、appender、日志格式 三大组件

logger就是在代码中通过LoggerFactory.getLogger创建的对象,我们用它来输出日志,

每个logger都可以通过setXXX方法来设置其日志输出级别、日志输出目的地appender(一般日志格式的配置是在appender内的),

但是如果每个logger都设置一遍这些参数就太繁琐了,所以日志框架的设计者就让这些logger形成一颗树,咱们在配置文件中只需对树上的某些节点进行配置日志级别、appender等就可以了


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部