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
日志特点:
- SQL 展示:
show-run-sql: true时展开 JDBC 占位符;为false时保留 SQL 模板和参数数组。展开后的内容主要用于调试,不应把它当成安全的 SQL 重写器。 - 执行耗时:日志消息包含毫秒耗时。
- 调用位置:
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 判定
- 框架记录 SQL 执行耗时;
- 未超过阈值时走 INFO 分支;
- 超过非零阈值时走 WARN 分支;
- SQL、参数和调用方是否展开由其他日志开关决定。
slow-sql-threshold: 0 表示不启用慢 SQL 判定。当前实现先检查 INFO 是否开启,再判断是否升级为 WARN;因此要可靠获得慢 SQL 日志,应保持 com.dlz.db 或 DbLogUtil 的 INFO 级别可用:
<!-- logback.xml -->
<logger name="com.dlz.db" level="INFO"/>
常见排查
设置了阈值却没有 WARN
依次检查:
- 配置是否被当前框架正确绑定;
- 阈值是否大于 0;
- SQL 耗时是否确实超过阈值;
- DLZ-DB logger 的 INFO 是否开启;
- WARN 是否被日志采集器过滤。
日志没有调用位置
确认 show-caller 已开启,并在 Logback/Log4j2 pattern 中显示框架写入的 MDC 信息。开关本身不会自动改变应用日志格式。
是否支持每个数据源不同阈值
当前配置是全局日志配置,不提供按数据源分别设置阈值的公共能力。需要差异化监控时,在应用日志或 APM 层处理。
生产环境建议
- 默认关闭
show-result,避免大结果序列化、日志膨胀和敏感信息泄漏; show-run-sql会展开参数,日志进入集中平台前应执行脱敏和权限控制;- 只在确认日志 pattern 有用时开启
show-caller; - 将应用慢 SQL 日志与数据库 slow query log、APM 和执行计划结合分析;
- 使用真实负载验证日志开关带来的性能影响;
- 慢 SQL 只说明耗时超过阈值,不自动证明问题来自框架或 SQL 本身。