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 ...
随机推荐
- 执行sudo命令时的提示语,如何修改?
如图所示,执行sudo命令,提示语(有中文和英文两个版本): 上面的提示内容是sudo软件原生的内容. 使用下面的方法,有的时候是可行的.sudo -p '提示语' 命令 如果要修改sudo软件原生的 ...
- ubuntu下C/C++编程起步
1. 安装VMware虚拟机软件 2. 在VMware中安装linux系统,这里安装的是Ubuntu.(用 VMware 安装 Ubuntu 12.04详细过程图解) 3. ubuntu有自带文本编辑 ...
- struts2中迭代的使用方法
struts2 Html代码 <s:iterator value="resultList" id="user" status="st&qu ...
- Failed to read artifact descriptor for avalon-framework:avalon-framewor
在工程中,遇到了这个问题,百度了好久并没有满意的解决方案. 网上有一种办法是: 一.修改.m2/repository/avalon-framework/avalon-framework-api/里所有 ...
- 解决Linux下AES解密失败
前段时间,用了个AES加密解密的方法,详见上篇博客AES加密解密. 加解密方法在window上測试的时候没有出现不论什么问题.将加密过程放在安卓上.解密公布到Linuxserver的时候,安卓将加密的 ...
- AAuto无法关闭CMD窗口怎么办
如下图所示,当执行了io.print函数之后,打开的CMD窗口无法使用关闭按钮关闭,其实只要点击左上角的控制台,把钩去掉,该窗口即可关闭.
- Solidworks如何开启自动求解
1 我打开了一个DWG格式的文件,提示草图太大,关闭的自动求解(就是没法撤销了) 2 工具-草图设定-自动求解 3 随便做一个标注,然后发现撤销按钮可以使用了,点击之后也的确可以撤销刚才的操作 ...
- HTTP学习笔记(一)报文和连接管理
对TCP/IP协议簇有些了解的同学们应该都知道.TCP/IP协议通过精简ISO网络7层协议(事实上了解历史渊源的话,TCP/IP协议本来目的并非简化ISO的7层协议.仅仅是因为ISO协议簇制定速度慢于 ...
- hadoop修改主机名遇到的坑
正确的修改方式 CentOS修改主机名(hostname) 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到r ...
- 华为P20无敌拍摄能力开放 如何即刻获得?
在全球专业相机测评机构DXOmark发布的相机评测排行中,华为P20.P20 Pro成功登顶“全球拍照最好智能手机”.P20 Pro综合得分高达109分,P20综合得分102分.“华为并非简单地将第三 ...