log4j 2 入门实例(3)
继承机制
- 所有logger都继承自root logger。
- 可以认为名为log4j2learn.Hello的logger继承自名为log4j2learn的logger。
- log4j会先查找名称是"log4j2learn.Hello"的logger,如果没有找到,向上查找名称是"log4j2learn"的logger,如果还没有找到那么继续向上查找,查找的最顶层就是rootLogger。
log4j2.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </appenders> <loggers> <!--我们只让这个logger输出trace信息,其他的都是error级别--> <!-- additivity开启的话,由于这个logger也是满足root的,所以会被打印两遍。 不过root logger 的level是error,为什么Bar 里面的trace信息也被打印两遍呢 --> <logger name="log4j2learn.Hello" level="trace" additivity="true"> <appender-ref ref="Console"/> </logger> <logger name="log4j2learn" level="info" additivity="true"> <appender-ref ref="Console"/> </logger> <root level="error"> <appender-ref ref="Console"/> </root> </loggers> </configuration>
样例代码如下
package log4j2learn; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; public class Hello { public static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Hello.class.getName()); public static void main(String[] args) { add(1, 2); } public static int add(int a , int b) { logger.entry(a, b); logger.info("我是info信息"); logger.warn("我是warn信息"); logger.error("我是error信息"); logger.fatal("我是fatal信息"); logger.printf(Level.TRACE, "%d+%d=%d", a, b, a + b); logger.exit(a + b); return a + b; } }
输出信息如下:
因为样例代码中使用了 public static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Hello.class.getName()); ,即使用名为log4j2learn.Hello的logger,该logger继承自名为root和log4jlearn的logger,所以所有信息都会输出三份。
2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2) 2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2) 2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2) 2017-02-13 15:21:33.758 [main] INFO log4j2learn.Hello - 我是info信息 2017-02-13 15:21:33.758 [main] INFO log4j2learn.Hello - 我是info信息 2017-02-13 15:21:33.758 [main] INFO log4j2learn.Hello - 我是info信息 2017-02-13 15:21:33.759 [main] WARN log4j2learn.Hello - 我是warn信息 2017-02-13 15:21:33.759 [main] WARN log4j2learn.Hello - 我是warn信息 2017-02-13 15:21:33.759 [main] WARN log4j2learn.Hello - 我是warn信息 2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息 2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息 2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息 2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息 2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息 2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3) 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3) 2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3) Process finished with exit code 0
问题
这种继承机制的适用场景是什么呢?
如果说适用于将日志信息送到上一级别存储到其它位置,那么在当前logger级别引入一个额外的Appender就可以满足这个需求。搞不懂继承机制有什么用。