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 ...
随机推荐
- ADO.NET-temple
ylbtech-ADO.NET:ADO.NET-Oracle|SQLServer|MySql|Access|Excel-dddd 介绍及讲解 1.A,插入数据(Create) 1.B,读取数据(Rea ...
- 获取安装后Apache、MySQL、Nginx、PHP编译时参数
# cat /usr/local/apache2/build/config.nice //获取Apache编译时的参数 #!/bin/sh # #Created by configure & ...
- 【前端阅读】——《编程之魂》摘记&读后感&思维导图
前言:这本书全名叫<编程之魂——与27为编程语言创始人对话>,它的内容以采访对话为主,以图通过和顶级大师的真实交流来调查:大师们为什么要创建某种编程语言,它的技术如何开发.如何教授和学习, ...
- 控制面板的cpl程序列表
控制面板的cpl程序列表 学习了:https://zhidao.baidu.com/question/2141898537654796628.html 最近用来sysdm.cpl: 辅助功能选项:ac ...
- Android内存泄露调试
Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...
- POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...
- PHP提权之异步执行
在服务器上都会定时运行一些脚本以完成周期性的任务. 而这些脚本往往是以root权限启动的, 替换或者改变其中的内容就可以完成提权.而今天在这要讲解的就是php提权中的异步执行方法. 在php中一般大家 ...
- UNP学习笔记(第二章:传输层)
本章的焦点是传输层,包括TCP.UDP和SCTP. 绝大多数客户/服务器网络应用使用TCP或UDP.SCTP是一个较新的协议. UDP是一个简单的.不可靠的数据报协议.而TCP是一个复杂.可靠的字节流 ...
- IE对CSS样式的数量和大小的限制
项目中遇到的问题,css写的样式无法渲染,各种百度后发现大概是这个原因: IE对CSS样式的数量和大小的限制 文档中只有前31个link或style标记关联的CSS能够应用. 从第32个开始,其标记关 ...
- 总结自己使用shell命令行经常使用到的8个小技巧
原创blog,转载请注明出处 Shell是命令解释器 [root@localhost ~]# cat /etc/shells 查看本系统共支持哪些shell 1 tab 命令补全 这个差点儿每次都能用 ...