因为需要在已有的某一个级别的日志中需要过滤排除某一些指定类的日志,所有用到了log4j 的自定义日志过滤器。
原始 日志内容 :
该日志配置会输出 文件目录格式 :
其中 backup 下为 备份日志,其他几个文件分别是对应的级别的日志,
现在我的业务场景中有个类 中会频繁调用,同时会输出 info 日志, 这个时候我需要把该类中的日志提取出来,放在单独的文件,于是我增加如下配置
再次测试后 ,目录结构变为 : 可以看到 增加了 zhelidu_dahan.log 相关的日志文件,
但是有个问题, zhelidu_dahan,log 文件中的日志在 zhelidu_info.log 中 也会输出一遍,这会导致内容重复输出。而且因为量大的问题,导致查看日志不好查看,且浪费存储空间
于是需要从 zhelidu_info.log 中排除调 zhelidu_dahan,log 中的日志,
分析 zhelidu_dahan.log 的日志, 可以看到该日志中都是有 下面的类输出
我们只要排除该类输出的文件即可,继续看如下 *_info的配置,
其中有一个 节点
可以看到很多个过滤器,具体各个filter的说明可以查看该
https://www.jianshu.com/p/174707b94e2f?utm_source=oschina-app
http://www.chaiguanxin.com/articles/2019/03/04/1551680272725.html#toc_h2_6
开始我将 使用 RegexFilter ,但是该类只能使用正则匹配 输出的自定义内容,不能直接只能类,除非将类名写到输出内容中,但是这样不太优雅 。
决定参考该 filter 自定义一个filter , 使用该filter 过滤指定的类
自定义FIlter 的代码如下 :
其中需要代码 是 如下这段 , event.getLoggerName() 为获取到的类名
重新修改 xml 中 info 的配置
增加如下两行
至此全部完成, 结尾放上 完整的log4j2.xml 的配置内容
需要说明的是onMatch和onMismatch可以选择的值及其含义。
onMatch : 当条件匹配时;
onMismatch : 当条件不匹配时;
可选的值分别是,ACCEPT, DENY, NEUTRAL,ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。--- 有点像switch case break; 直接截断了 不会往下判断了。在组合过滤器中,接受使用NEUTRAL(中立),被个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。 --- 也就是层层过滤的意思,要都满足条件才能写入日志
可以从 源码中看到 :
位置 org.apache.logging.log4j.core.filter.CompositeFilter#filter(org.apache.logging.log4j.core.LogEvent)
@Override
public Result filter(final LogEvent event) {
Result result = Result.NEUTRAL;
for (int i = 0; i < filters.length; i++) {
result = filters[i].filter(event);
if (result == Result.ACCEPT || result == Result.DENY) {
return result;
return result;
其中 : filters 就是 组合过滤器, 可以看到 这行
result == Result.ACCEPT || result == Result.DENY 当某个过滤返回的结果为 ACCEPT ,
或者 DENY 直接结束循环, 只有 在 NEUTRAL 的时候才会继续走下一个过滤器
以下为完整的配置文件内容 :
当然 这里可以使用另一种实现方案, 这个方案更简单点,就是 在输出是需要指定标记
使用方式见连接 :
https://blog.csdn.net/sweetyi/article/details/104547002/