线上日志级别需精准可控可逆:INFO为生产底线,DEBUG仅限定位细节,WARN表潜在风险,ERROR须含完整堆栈;禁用全局DEBUG,优先用管理端点或Arthas动态调级,并事后固化日志策略。

线上突发异常时,日志级别不是“调高就行”,而是要精准、可控、可逆——既要看到关键细节,又不能淹没有效信息或拖慢服务。
明确日志级别的生产意义
INFO 是生产默认底线:记录启动、关键业务动作(如订单创建、支付回调)、状态变更;DEBUG 仅用于定位逻辑分支、变量值、SQL 参数等;WARN 表示潜在风险(如降级触发、重试成功);ERROR 必须包含完整堆栈,且只用于真正阻断流程的问题。
盲目把全局日志切到 DEBUG,会导致磁盘 IO 暴增、日志文件秒变 GB 级、甚至触发磁盘满告警——这不是排查,是制造次生故障。
优先用动态调整,而不是改配置重启
Spring Boot 项目推荐暴露一个管理端点,像这样:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- POST /log-level?level=DEBUG,只临时提升根日志级别
- 支持按包名精细控制,比如只开 com.example.order.service 的 DEBUG,避免全量刷屏
- 操作后立即验证:查最新日志是否出现预期的 SQL 或参数打印,确认生效
- 问题定位后,立刻切回 INFO,防止持续写入干扰
用 Arthas 实时热修改(无侵入、不重启)
适用于无法加管理接口的老系统,或需要秒级响应的紧急场景:
- 连接目标 JVM:java -jar arthas-boot.jar
- 查当前 logger 状态:logger
- 精准调级:logger --name com.example.payment --level DEBUG
- 观察几秒日志输出变化,确认 SQL、入参、出参是否可见
- 恢复只需再执行一次 logger --name ... --level INFO
配合异常堆栈快速聚焦
调完级别后,别从头翻日志。直接搜这些关键词:
- "Caused by:" —— 找根因异常(常在最后一行)
- "at com.yourpackage" —— 定位业务代码行号
- "ERROR" + 时间窗口(比如故障发生前后 2 分钟)
- 如果用了 MyBatis,重点看 DEBUG 日志里的 PreparedStatement 和绑定参数,比堆栈更能暴露 SQL 逻辑错误
事后必须收口:日志策略要固化
一次应急操作不能变成日常习惯。建议落地三项机制:
- 所有 ERROR 日志必须带异常对象,禁止只打字符串:logger.error("DB timeout", e)
- 核心模块(如支付、库存)默认开启 WARN+,非核心模块 INFO+
- 上线前用脚本扫描代码,确保没有残留的 logger.debug(...) 在关键路径上无条件执行

















