hibernate框架过滤select日志,保留update/delete/insert类型的日志


由于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"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值