由于hibernate框架select日志太多,大部分情况对于定位问题没有什么帮助,还占用磁盘,影响打印日志的效率,而update/delete/insert类型的日志又比较重要,对于定位问题很有帮助,但是hibernate框架要么就打印所有sql日志,要么就都不打印,翻了很多文档,也没有找到完美的解决方案,最终通过logback的filter过滤器实现了,而且如果需要打印参数,也会过滤掉select类型sql查询条件中对应的参数,filter代码如下:
/**
* @date 2024-08-01
*/
public class SqlFilter extends Filter<ILoggingEvent> {
private static Map<String, Boolean> paramFlag = new HashMap<>();
private static final String SQL_LOGGER = "org.hibernate.SQL";
private static final String BIND_BASIC_LOGGER = "org.hibernate.type.descriptor.sql.BasicBinder";
private static final Set<String> ALLOW_SQL = CollUtil.set(false, "update", "delete", "insert");
private static final Set<String> IGNORE_SQL = CollUtil.set(false, "select");
@Override
public FilterReply decide(ILoggingEvent event) {
String message = event.getMessage();
String loggerName = event.getLoggerName();
String threadName = Thread.currentThread().getName();
//对sql语句的过滤
if (loggerName.equals(SQL_LOGGER)) {
for (String ignore : IGNORE_SQL) {
if (message.startsWith(ignore)) {
paramFlag.put(threadName, false);
return FilterReply.DENY;
}
}
for (String allow : ALLOW_SQL) {
if (message.startsWith(allow)) {
paramFlag.put(threadName, true);
}
}
}
//对参数的过滤
else if (loggerName.equals(BIND_BASIC_LOGGER)) {
if (!paramFlag.getOrDefault(threadName, true)) {
return FilterReply.DENY;
}
}
return FilterReply.ACCEPT;
}
}
将filter加入logback的配置文件,放到appender下面
<!-- info日志 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}${file.separator}info.log</file>
<filter class="com.xxx.common.rdb.logback.SqlFilter"/>
<encoder>
<pattern>
${log.pattern}
</pattern>
</encoder>
<!-- 滚动策略 按照日期生成日志存档文件,并进行zip压缩-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${log.path}${file.separator}%d{yyyy-MM-dd,aux}${file.separator}info-%d{yyyy-MM-dd}.%i.log.gz
</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<maxFileSize>${maxFileSize}</maxFileSize>
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
</appender>
打印sql和参数分别需要在logback.xml中加入下面两个logger
<!-- show hibernate sql -->
<logger name="org.hibernate.SQL" level="DEBUG"/>
<!-- show parameters for hibernate sql -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>