Log4j2自定义过滤器

使用druid数据源可以把所有执行的sql都打印出来,在log4j2中加入以下logger即可

    <Logger name="druid.sql.Statement" level="debug"/>
    <Logger name="druid.sql.ResultSet" level="debug"/>
然而,集成quartz分布式版后,quartz在后台定时不断的执行sql,这些sql也通过log4j2不停的打印出来,不断刷屏。

这些sql日志不是我需要的,我不想记录它。

花了些时间,对log4j2研究后,发现它有过滤器功能,可以过滤不需要的日志,非常方便。详情看这里:Log4j2 Filters

但是没有找到我需要的过滤器,我需要对Quartz的日志进行过滤。于是自定义了一个过滤器,解决了我问题。

经分析,发现打印Quartz日志的线程名含有Quartz和schedulerFactory,于是从这里入手,写了一个过滤器,排除指定线程名记录的日志。

@Plugin(name = "ThreadFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class ThreadFilter extends AbstractFilter {

	private final String threadName;
	 
    private ThreadFilter(String threadName, Result onMatch, Result onMismatch) {
        super(onMatch, onMismatch);
        this.threadName = threadName;
    }
 
    public Result filter(Logger logger, Level level, Marker marker, String msg, Object[] params) {
    	return filter(Thread.currentThread());
    }
 
    public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {
    	return filter(Thread.currentThread());
    }
 
    public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {
    	return filter(Thread.currentThread());
    }
 
    @Override
    public Result filter(LogEvent event) {
       return filter(Thread.currentThread());
    }
    
    public Result filter(Thread thread) {
        if(thread.getName()==null) return onMismatch;
    	return thread.getName().indexOf(threadName)>=0 ? onMatch : onMismatch;
    }
 
    @Override
    public String toString() {
        return threadName.toString();
    }
    
    @PluginFactory
    public static ThreadFilter createFilter(@PluginAttribute("threadName") String threadName,
					@PluginAttribute("onMatch") final Result match,
					@PluginAttribute("onMismatch") final Result mismatch) {
        return new ThreadFilter(threadName, match, mismatch);
    }
}
然后,log4j2.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off" monitorInterval="600" packages="org.myapp.common.log4j">
  <Properties>
  	<Property name="appname">myapp</Property>
    <Property name="logdir">/data/myapp/logs</Property>
  </Properties>
  <Appenders>
    <Console name="stdout" target="system_out">
      <PatternLayout pattern="%d{absolute} %5p [%c{2}:%line] - %m%n"/>
      <!-- %d %-5p [%t] %c{2} (%f:%l) - %m%n -->
    </Console>
    <!-- 程序员调试日志 -->  
    <RollingRandomAccessFile name="logfile" fileName="${logdir}/${appname}.log" filePattern="${logdir}/${appname}.%d{yyyy-MM-dd}.log.gz">
        <!-- <RegexFilter regex="Quartz.*" onMatch="DENY" onMismatch="ACCEPT"/> -->
        <Filters>
	      <ThreadFilter threadName="Quartz" onMatch="DENY" onMismatch="NEUTRAL"/>
	      <ThreadFilter threadName="schedulerFactory" onMatch="DENY" onMismatch="ACCEPT"/>
	    </Filters>
        <PatternLayout pattern="%date{MM-dd HH:mm:ss} %level [%thread][%file:%line] - %msg%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="5" modulate="true" />
            <SizeBasedTriggeringPolicy size="200 MB" />
        </Policies>
        <DefaultRolloverStrategy>
	        <Delete basePath="${logdir}" maxDepth="1">
	          <IfFileName glob="${appname}.*.log.gz" />
	          <IfLastModified age="30d" />
	        </Delete>
	    </DefaultRolloverStrategy>
    </RollingRandomAccessFile>  
  </Appenders>
  <Loggers>
    <Root level="error">
    	<AppenderRef ref="stdout"/>
    	<AppenderRef  ref="logfile"/>
    </Root>
    <Logger name="org.myapp" level="debug"/>
    <Logger name="org.springframework" level="info"/>
    <Logger name="org.hibernate" level="error"/>
    <Logger name="druid.sql.Statement" level="debug"/>
    <Logger name="druid.sql.ResultSet" level="debug"/>
  </Loggers>
</Configuration>

  
  
  
  
注意:Configuration标签的packages属性设置为自定义过滤器( ThreadFilter )的包名,表示log4j2会去这个包下查找扩展类。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值