log4j2 日志打两遍的问题
在使用log4j2的时候,一般都需要不同的日志分类打印不同的日志等级,如下面的配置

<!-- 用于指定log4j自动重新配置的监测间隔时间,单位是秒 -->
<configuration debug="off" monitorInterval="10">
<Properties>
<Property name="log-path">server_logs</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT"> <PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss} %t-%T %-5level %class{36} - %msg%xEx%n" />
</Console>
</Appenders>
<Loggers>
<logger name = "com.mygame" level="debug">
<appender-ref ref="console" />
</logger>
<root level="error">
<appender-ref ref="console" />
</root>
</Loggers>
</configuration>

这个配置的目标是,没有指定logger的时候,日志输出使用root,而root的级别是error,希望com.mygame包下面的日志输出debug级别。但是这样运行之后,发现日志输出了两遍,我是在从消息队列中接收消息之后打印的日志,害得我以为一个消息被处理了两次。
这种情况是log4j2的机制问题,在Log4j2中,logger是有继承关系的,root是根节点,而上面配置中添加的logger就是root的子节点,在log4j2中,有个additivity的属性,它是子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。由于上面的配置com.mygame的logger和root都输出到console中了,所以会显示输出了两条日志。
要打破这种传递性,也非常简单,在logger中添加 additivity = "false",如下所示:

<Loggers>
<logger name = "com.mygame" level="debug" additivity = "false">
<appender-ref ref="console" />
</logger>
<root level="error">
<appender-ref ref="console" />
</root>
</Loggers>
log4j2 日志打两遍的问题的更多相关文章
- Spring + MyBaits 日志初始化两遍的问题
偶然发现一个问题,记录一下以备查询. 问题:系统启动时发现日志初始化了两次 14:28:04.798 [main] DEBUG org.apache.ibatis.logging.LogFactory ...
- log4j2日志配置
背景 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等. 1. ...
- spring boot自定义log4j2日志文件
背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8. ...
- Spring Boot Log4j2 日志学习
简介 Java 中比较常用的日志工具类,有: Log4j. SLF4j. Commons-logging(简称jcl). Logback. Log4j2(Log4j 升级版). Jdk Logging ...
- 浅谈Log4j2日志框架及使用
目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...
- Springboot整合log4j2日志全解
目录 常用日志框架 日志门面slf4j 为什么选用log4j2 整合步骤 引入Jar包 配置文件 配置文件模版 配置参数简介 Log4j2配置详解 简单使用 使用lombok工具简化创建Logger类 ...
- Log4j2日志技术总结
前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...
- HDU5886 Tower Defence 【两遍树形dp】【最长链预处理】
题意:N个点的一棵带权树.切掉某条边的价值为切后两树直径中的最大值.求各个边切掉后的价值和(共N-1项). 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表 ...
- Log4j2 日志级别
Log4j2日志级别 级别 在log4j2中, 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < ...
随机推荐
- 齐治堡垒机前台远程命令执行漏洞(CNVD-2019-20835)分析
一.基本信息 漏洞公告:https://www.cnvd.org.cn/flaw/show/1632201 补丁信息:该漏洞的修复补丁已发布,如果客户尚未修复该补丁,可联系齐治科技的技术支持人员获得具 ...
- 使用Dreamweaver制作简单网站(二)
继续上周没完成的 一.新建iframe.css 1.点击文件-选择新建-css 2.ctrl+s保存为iframe.css 在style文件夹下. 3.回到main.html 右键选择-附加样式表,选 ...
- Java开发环境不再需要配置classpath!
前言: 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候,确实不需要对classpath进行配置,但市面上的书籍,以及一些博客.还是老 ...
- 龙芯 飞腾 intel的 OpenBenchMarking数据
1. 今天从openbenchmarking 里面进行了简单的查找. 数据主要为: 机器配置: LS3A3000的数据为: 来源: https://openbenchmarking.org/resul ...
- Oracle的查询-自连接概念和联系
查询出员工姓名,员工领导姓名 select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno; 结果 自连接:站在不同角度把一张 ...
- Python 中 参数* 和 **
举个例子就知道了 class test(): def __init__(self, *a, **b): print(a) print(b) print(b.get('test')) tester = ...
- 使用pycharm开发web——django2.1.5(二)创建一个app并做一些配置
这里我学习的呢是刘江老师的站,主要原因在于他这个版本新,还比较细节 网址先留一手,约等于在引用http://www.liujiangblog.com/ 开始正题: 1.在pycharm界面终端命令行里 ...
- MySQL 聚合函数(一)聚合(组合)函数概述
MySQL版本:5.7+ 本节介绍对值的集合进行操作的组合(聚合)函数.翻译自:Aggregate (GROUP BY) Function Descriptions 一.MySQL 5.7中的聚合函数 ...
- 一个复杂关联的sql
在项目中遇到了一个比较复杂关系的sql,关联关系有些模糊,现在梳理一下 sql如下: SELECT TRAN.TRANS_DATE, TRAN.TRANS_TIME, TRAN.BUSI_TRAC_C ...
- Thread 和 Runnable
Thread 和 Runnable 1. 简介 Java 主要是通过 java.lang.Thread 类以及 java.lang.Runnable 接口实现线程机制的. Thread 类为底层操作系 ...