能否限制Hibernate的SQL日志仅记录更新等指定操作?
你提的需求可以实现,无需修改业务代码,仅通过扩展Log4j的过滤器配置就能完成,具体方案如下:
实现方案
前置说明
我们基于Hibernate输出SQL的规则做过滤:Hibernate的org.hibernate.SQL日志输出的内容直接就是可执行的SQL语句,开头为对应操作关键字(INSERT/UPDATE/DELETE/SELECT等),语句中会携带目标表名,完全可以通过正则匹配完成过滤。
方案1:仅记录INSERT、UPDATE操作
给SQL输出的Appender添加正则过滤器,匹配日志内容开头为INSERT或UPDATE即可,完整配置示例如下:
<!-- 你的SQL日志输出Appender --> <RollingFile name="SQLFileAppender" fileName="logs/sql.log" filePattern="logs/sql-%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <!-- 新增正则过滤器,onMatch=ACCEPT表示匹配就保留,onMismatch=DENY表示不匹配就丢弃 --> <RegexFilter regex="^(INSERT|UPDATE).*" onMatch="ACCEPT" onMismatch="DENY"/> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> <!-- 原来的Logger配置不用改 --> <Logger name="org.hibernate.SQL" level="DEBUG" additivity="false"> <AppenderRef ref="SQLFileAppender" /> </Logger> <Logger name="org.hibernate.type" level="TRACE" additivity="false"> <AppenderRef ref="SQLFileAppender" /> </Logger>
方案2:同时限定指定表的操作
如果只需要记录某几张表的INSERT/UPDATE操作,调整正则规则即可,比如要监控user、order两张表的操作,过滤器配置改为:
<RegexFilter regex="^(INSERT|UPDATE).*(user|order)" onMatch="ACCEPT" onMismatch="DENY"/>
注意事项
- 如果你的Hibernate开启了SQL格式化配置(
hibernate.format_sql=true),SQL输出会换行,需要关闭该配置或者调整正则支持换行匹配,否则正则会失效。 - 如果SQL中表名带有别名,可适当放宽正则规则,比如去掉开头匹配限制,改为
.*(INSERT|UPDATE).*(user|order).*即可。 - 如果你用的是Log4j 1.x版本,替换为
ExpressionFilter即可实现相同效果,配置规则逻辑一致。
内容的提问来源于stack exchange,提问作者Mariusz Jędrzejewski
相关产品推荐
相关产品推荐

