log4j2 xml配置文件屏蔽第三方依赖包的日志方式
作者:苦荞米
第三方日志
代码如下,这个是一个最简单的,只打印日志到控制台的配置,这里将用这个代码来作为例子来解释如何屏蔽掉第三方日志。
<?xml version="1.0" encoding="UTF-8" ?> <Configuration status="WARN" monitorInterval="600"> <Appenders> <Console name="console_out_appender" target="SYSTEM_OUT"> <!-- 输出日志的格式 --> <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/> </Console> </Appenders> <Loggers> <!-- 配置日志的根节点,打印trace等级及其以上等级的日志 --> <root level="trace"> <appender-ref ref="console_out_appender"/> </root> </Loggers> </Configuration>
在用这个配置文件的时候,就会发现有大量的第三方日志充斥其中,导致像查找自己的日志非常的困难,效果如下所示
这个是第三方日志中的zookeeper的心跳机制日志,几乎一秒钟输出一行,特别烦人
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:30 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 48ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:31 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 9ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:32 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 4ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:34 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 7ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:35 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 6ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:36 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 24ms
DEBUG [RMI TCP Connection(192.168.9.5:2181)] 2021-07-21 10:46:38 (ClientCnxn.java:717) Got ping response for sessionid: 0x17a18cc4d2b4155 after 11ms
专门屏蔽某一个第三方日志
要想屏蔽这个日志,一个是直接提升日志的根节点的日志等级到info,这样就看不到这些日志了,但是这样也会掩盖主自己的info已下的等级的日志。
但可以通过添加<logger>
标签来专门屏蔽第三方日志,代码如下所示。
<?xml version="1.0" encoding="UTF-8" ?> <Configuration status="WARN" monitorInterval="600"> <Appenders> <Console name="console_out_appender" target="SYSTEM_OUT"> <!-- 输出日志的格式 --> <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/> </Console> </Appenders> <Loggers> <!-- 配置日志的根节点 --> <root level="trace"> <appender-ref ref="console_out_appender"/> </root> <!-- 第三方日志系统 --> <logger name="org.apache.zookeeper" level="info"/> </Loggers> </Configuration>
这样就可以通过info的等级来专门限制zookeeper的心跳机制日志了,同时不影响自己的日志等级。
但是乱输出日志的东西还有很多,其中就包括spring框架,然后就可以通过添加logger的方式来屏蔽日志
批量屏蔽第三方日志
为了屏蔽第三方日志,不得不加了很多logger,而且还屏蔽不全,最主要的原因是不知道要屏蔽的logger的name属性,只能从网上搜,结果如下,依然屏蔽不全。
<!-- 第三方日志系统 --> <logger name="org.springframework.core" level="info"/> <logger name="org.springframework.beans" level="info"/> <logger name="org.springframework.context" level="info"/> <logger name="org.springframework.web" level="info"/> <logger name="org.jboss.netty" level="info"/> <logger name="org.apache.http" level="info"/> <logger name="org.apache.zookeeper" level="info"/> <logger name="org.apache.maven.plugins" level="info"/>
怎么批量设置第三方日志,我试了用通配符'*'
,但是不管用,网上搜了半天,发现对logger节点下name属性的描述只有一句话:name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。
可能是我阅读理解不行,看不懂。
最后查了https://stackoverflow.com/questions/44551571/log4j2-wildcard-logger-names和https://logging.apache.org/log4j/2.x/manual/api.html#Logger_Names,才明白,只要屏蔽掉了父级日志,就会自动屏蔽子一级日志。
所以上面写这么多东西都屏蔽不全的,改成下面一句话就可以了。
<!-- 第三方日志系统 --> <logger name="org" level="info"/>
天哪,网上搜了好多人的答案,都是傻乎乎的一个一个的配置,看着真是让人太绝望了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。