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就可以满足这个需求。搞不懂继承机制有什么用。
log4j 2 入门实例(3)的更多相关文章
- log4j 2 入门实例(1)
本文介绍log4j的基本概念和将日志输出到控制台的例子. 参考文章: http://www.jianshu.com/p/464058bdbc76 http://www.hankcs.com/progr ...
- log4j 2 入门实例(2)
本文介绍将日志输出到文件的例子. log4j 2输出到文件 log4j2.xml文件 这个文件里,定义了三个类型的Appender:Console.File和RollingFile. Console类 ...
- mybatis 详解(二)------入门实例(基于XML)
通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一 ...
- java 日志体系(三)log4j从入门到详解
java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...
- freemarker入门实例与源码研究准备工作
首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...
- 1. mybatis 的入门实例
mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ...
- mybatis学习一:基于xml与注解配置入门实例与问题
注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...
- React 入门实例教程(转载)
本人转载自: React 入门实例教程
- struts入门实例
入门实例 1 .下载struts-2.3.16.3-all .不摆了.看哈就会下载了. 2 . 解压 后 找到 apps 文件夹. 3. 打开后将 struts2-blank.war ...
随机推荐
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
- xamarin.ios 本地通知推送
由于ios10版本以后UILocalNotification被标为弃用了,所以要添加新的本地通知推送功能,下面提供一些代码参考. 一.先在AppDelegate.cs上注册本地通知推送功能. publ ...
- Source tree配置gitlab
1.打开控制台:ssh-keygen -t rsa -C "GIT上的账号邮箱" 2.回车 3.输入密码(git上的账号密码) 4.确认密码 5.输入命令 cd .ssh 6.输入 ...
- VS2010 MFC中 创建文件夹及文件判空的方法
1. MFC中 创建文件夹的方法如下: CString strFolderPath = "./Output"; //判断路径是否存在 if(!PathIsDirectory(str ...
- 用CHttpFile实现简单的GET/POST数据【转】
一.GET 数据,下载网页,文件等,用于可下载的文件,不能用于服务端运行的程序,比如.aspx文件等,否则会返回500错误. CString strSentence, strWriteName=&qu ...
- MySQL监控工具——innotop
MySQL监控工具--innotop innotop是一个mysql数据库实时监控工具,其功能强大,信息种类繁多,很能体现数据库的状态. 它实际上是一个perl脚本,整合show status/sho ...
- Java enum枚举的使用方法
一. 出现背景: 在JDK1.5之前,我们定义常量是这种:public static final String RED = "RED"; 在JDK1.5中增加了枚举类型,我们能够把 ...
- vscode 折叠所有区域
- hdu 4372 第一类斯特林数
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- Java使用笔记之stream和sorted使用
//对象类型stream排序List<User> users = new ArrayList<User>(){ { add(new User("a", &q ...