跳到主要内容

3.8 日志与慢 SQL

开启日志

dlz:
db:
log:
show-run-sql: true # 打印可执行 SQL
show-caller: true # 将调用位置写入 MDC;需由日志 pattern 显示
show-result: false # 打印查询结果(有性能影响)

日志输出格式

query 12ms sql:SELECT * FROM user WHERE id = 1 AND deleted = 0

日志特点:

  1. SQL 展示show-run-sql: true 时展开 JDBC 占位符;为 false 时保留 SQL 模板和参数数组。展开后的内容主要用于调试,不应把它当成安全的 SQL 重写器。
  2. 执行耗时:日志消息包含毫秒耗时。
  3. 调用位置show-caller: true 通过 MDC 注入调用方信息;最终是否显示、能否在 IDE 中点击,取决于应用的日志 pattern 和控制台。

慢 SQL

dlz:
db:
log:
show-run-sql: true
slow-sql-threshold: 1000 # 慢 SQL 阈值(毫秒),0 表示不启用

超过阈值的 SQL 会走 WARN 级别分支。当前实现会先检查该 logger 的 INFO 是否开启,因此若将 com.dlz.db.util.DbLogUtil 的级别直接设为 WARN,反而可能不会进入慢 SQL 判定。需要慢 SQL 日志时,请保持该 logger 的 INFO 可用。

示例输出:

WARN [main] c.d.db.util.DbLogUtil - query 1250ms sql:SELECT * FROM user WHERE status = 1

使用建议:

  • 开发环境:设置为 0(不启用)或较大值(如 5000ms)
  • 测试环境:设置为 1000ms,发现潜在性能问题
  • 生产环境:设置为 500-1000ms,及时发现慢查询

阈值只是起点,应根据业务延迟目标、数据库类型和历史基线调整,不要把固定数值当作通用标准。

Spring Boot 与 Solon 配置

Spring Boot 使用层级 YAML:

dlz:
db:
log:
show-run-sql: true
show-result: false
show-caller: true
slow-sql-threshold: 1000

Solon 也绑定同一组 dlz.db.log.* 属性;配置文件语法可按项目当前的 Solon YAML 风格书写。

调用位置

show-caller 只负责把调用方信息写入 MDC。要在最终日志里显示文件和行号,应用日志 pattern 必须输出对应 MDC 字段;IDE 是否可点击还取决于控制台。

WARN [main] c.d.db.util.DbLogUtil - query 1250ms sql:SELECT ...
caller:(UserService.java:45)

采集调用栈会产生额外开销,生产环境应先评估日志量和延迟影响。

慢 SQL 判定

  1. 框架记录 SQL 执行耗时;
  2. 未超过阈值时走 INFO 分支;
  3. 超过非零阈值时走 WARN 分支;
  4. SQL、参数和调用方是否展开由其他日志开关决定。

slow-sql-threshold: 0 表示不启用慢 SQL 判定。当前实现先检查 INFO 是否开启,再判断是否升级为 WARN;因此要可靠获得慢 SQL 日志,应保持 com.dlz.dbDbLogUtil 的 INFO 级别可用:

<!-- logback.xml -->
<logger name="com.dlz.db" level="INFO"/>

常见排查

设置了阈值却没有 WARN

依次检查:

  1. 配置是否被当前框架正确绑定;
  2. 阈值是否大于 0;
  3. SQL 耗时是否确实超过阈值;
  4. DLZ-DB logger 的 INFO 是否开启;
  5. WARN 是否被日志采集器过滤。

日志没有调用位置

确认 show-caller 已开启,并在 Logback/Log4j2 pattern 中显示框架写入的 MDC 信息。开关本身不会自动改变应用日志格式。

是否支持每个数据源不同阈值

当前配置是全局日志配置,不提供按数据源分别设置阈值的公共能力。需要差异化监控时,在应用日志或 APM 层处理。

生产环境建议

  • 默认关闭 show-result,避免大结果序列化、日志膨胀和敏感信息泄漏;
  • show-run-sql 会展开参数,日志进入集中平台前应执行脱敏和权限控制;
  • 只在确认日志 pattern 有用时开启 show-caller
  • 将应用慢 SQL 日志与数据库 slow query log、APM 和执行计划结合分析;
  • 使用真实负载验证日志开关带来的性能影响;
  • 慢 SQL 只说明耗时超过阈值,不自动证明问题来自框架或 SQL 本身。