You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何屏蔽SqlExceptionHelper的ORA-00054日志却保留有用异常?

解决SqlExceptionHelper重复输出ORA-00054锁冲突日志的问题

你遇到的核心问题是:捕获了for update nowait的锁冲突异常后,Hibernate的SqlExceptionHelper仍会打印ORA-00054的日志导致刷屏,但直接调高该类日志级别会丢失约束违规等重要错误信息。以下是精准过滤特定日志的实现方案:

方案1:自定义日志过滤器(适配Logback)

通过自定义过滤器拦截指定日志内容,不影响其他异常信息输出。

步骤1:编写过滤器类

import ch.qos.logback.classic.filter.Filter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.FilterReply;

public class OracleLockExceptionFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        String logMsg = event.getMessage();
        // 精准匹配ORA-00054的日志内容,拒绝输出
        if (logMsg != null && logMsg.contains("ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired")) {
            return FilterReply.DENY;
        }
        // 其他日志正常放行
        return FilterReply.NEUTRAL;
    }
}

步骤2:配置Logback(logback-spring.xml)

将过滤器绑定到SqlExceptionHelper的logger上:

<configuration>
    <!-- 保留原有日志配置 -->
    <logger name="org.hibernate.engine.jdbc.spi.SqlExceptionHelper" level="WARN">
        <filter class="com.your.package.OracleLockExceptionFilter" />
    </logger>
</configuration>

方案2:用正则过滤器快速实现(无需自定义类)

如果不想编写Java类,可直接用Logback的EvaluatorFilter通过表达式过滤:

<logger name="org.hibernate.engine.jdbc.spi.SqlExceptionHelper" level="WARN">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator>
            <expression>message.contains("ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired")</expression>
        </evaluator>
        <onMatch>DENY</onMatch>
        <onMismatch>NEUTRAL</onMismatch>
    </filter>
</logger>

方案3:适配Log4j2的实现

如果项目用Log4j2作为日志框架,可按以下方式配置:

自定义过滤器类

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.filter.AbstractFilter;

public class OracleLockExceptionFilter extends AbstractFilter {
    @Override
    public Result filter(LogEvent event) {
        String logMsg = event.getMessage().getFormattedMessage();
        if (logMsg.contains("ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired")) {
            return Result.DENY;
        }
        return Result.NEUTRAL;
    }
}

配置Log4j2(log4j2.xml)

<Configuration>
    <!-- 保留原有日志配置 -->
    <Logger name="org.hibernate.engine.jdbc.spi.SqlExceptionHelper" level="WARN">
        <Filters>
            <Filter type="com.your.package.OracleLockExceptionFilter" />
        </Filters>
    </Logger>
</Configuration>

以上方案均可实现:屏蔽ORA-00054的刷屏日志,同时保留SqlExceptionHelper输出的其他重要SQL异常信息(如约束违规、语法错误等)。

内容的提问来源于stack exchange,提问作者serv-inc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:52:37