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

如何在Logback配置中按日志消息过滤并格式化SQL语句?

过滤log4jdbc冗余日志,只输出格式化后的SQL语句

配置方案

要实现只保留SQL语句并格式化输出,直接调整Logback的日志级别、添加过滤规则,同时用消息转换器处理格式即可:

修改后的完整Logback配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过滤掉非SQL日志行 -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <!-- 匹配以数字序号开头、包含常见SQL关键字的行 -->
                <expression>message matches "^\d+\. .*(select|insert|update|delete|create|alter|drop)\s"</expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!-- 格式化SQL消息:移除序号、执行时间,添加分号 -->
        <encoder>
            <Pattern>%replace(%msg){'^\d+\. (.*) \{executed in \d+ ms\}', '$1'};%n</Pattern>
        </encoder>
    </appender>

    <!-- 关闭所有log4jdbc冗余日志分支,只保留SQL执行计时日志 -->
    <logger name="jdbc.audit" level="OFF" />
    <logger name="jdbc.connection" level="OFF" />
    <logger name="jdbc.sqltiming" level="INFO" />
    <logger name="jdbc.resultset" level="OFF" />
    <logger name="jdbc.resultsettable" level="OFF" />

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

关键配置说明

  • 日志级别管控:把jdbc.sqltiming设为INFO(这是log4jdbc输出完整SQL的分支),其他log4jdbc相关日志直接设为OFF,从根源减少冗余。
  • 行过滤:通过EvaluatorFilter的正则表达式,只放行包含SQL关键字的日志行,彻底剔除PreparedStatement相关的冗余操作日志。
  • 格式修正:用%replace转换器完成三步处理:去掉行首的数字序号、移除末尾的执行时间标记、在SQL末尾添加分号,输出符合要求的格式。

最终输出示例

delete from AIXM_FEATURE_EVENT_MAPPING where TS_ID='3b855115-2da2-495c-a3bf-b2328916ef77';

内容的提问来源于stack exchange,提问作者grandidark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:11:14