使用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会去这个包下查找扩展类。
————————————————
版权声明:本文为CSDN博主「leon@love」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhanngle/article/details/79264656