如何屏蔽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
相关产品推荐
相关产品推荐

