继承机制

  • 所有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就可以满足这个需求。搞不懂继承机制有什么用。

最新文章

  1. Oracle库Delete删除千万以上普通堆表数据的方法
  2. scala学习之: Flatten a nested list structure
  3. 微信红包中使用的技术:AA收款+随机算法
  4. 树形dp Anniversary party(HDU1520)
  5. 【CentOS】安装jdk
  6. 转载:mysql 对于百万 千万级数据的分表实现方法
  7. Eclipse Tomcat : Project facet Java version 1.7 is not supported.
  8. Bcdedit命令使用详解使用方法
  9. Sublime Text 2 Plugin Installation
  10. [UE4]动态改变相机OrthWidh、关掉阴影
  11. 在QTableView中某列中添加Button的导致滚动条滚动的时候消失的问题
  12. 微软ASP.NET网站部署指南(2):部署SQL Server Compact数据库
  13. iOS开发之plist文件操作
  14. qt在动态库里面加载widget的例子
  15. 【progress】 进度条组件说明
  16. visual studio 个性化设置
  17. fis3解决web网站缓存问题
  18. storm 入门介绍(持续更新)
  19. Asp.net 5 (MVC6) Areas 分区
  20. js 读本地文件

热门文章

  1. Docker 存储引擎
  2. CBIntrospector俗称:内部检查工具
  3. novell.directory.ldap获取邮箱活动目录
  4. 关于Android内存优化你应该知道的一切
  5. C语言对文件的读写操作以及处理CSV文件的方法
  6. 有关javaScript面向对象和原型笔记
  7. appium查找元素心得
  8. 关于异步请求AJAX的具体解释
  9. 转: Gradle:Gradle入门
  10. HTTP错误状态码定位与解决