Log4j2自定义过滤器

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

    
    
然而,集成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配置如下:



  
  	myapp
    /data/myapp/logs
  
  
    
      
      
    
      
    
        
        
	      
	      
	    
        
        
            
            
        
        
	        
	          
	          
	        
	    
      
  
  
    
    	
    	
    
    
    
    
    
    
  


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


你可能感兴趣的:(javaee,杂七杂八)