生产环境隐藏堆栈、开发环境保留完整信息,通过@profile或environment判断profile,动态构造响应体并分级记录日志,结合application-{env}.yml配置开关实现细粒度控制。

在全局异常处理中区分环境、按需屏蔽堆栈信息,核心是利用 Spring 的 Environment 抽象和日志/响应逻辑的条件分支,而不是硬编码开关或手动改配置。生产环境必须隐藏原始堆栈,开发环境则保留完整信息便于调试。
通过 @Profile 或 environment.getActiveProfiles() 判断环境
Spring Boot 提供了运行时环境识别能力,推荐在 @ControllerAdvice 中注入 Environment 实例,再根据激活的 profile 决定是否暴露堆栈:
- 若当前 profile 包含
"prod"或"production",返回通用错误提示,不包含e.getStackTrace()或e.toString() - 若为
"dev"、"local"或未指定 profile,默认视为开发环境,可记录并返回完整堆栈(仅限内部日志,前端响应仍建议脱敏) - 避免用
spring.profiles.active=prod以外的方式判断(如读取系统属性),确保与 Spring 生命周期一致
响应体按环境差异化构造
同一个 @ExceptionHandler 方法内,可动态组装响应内容:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 开发环境:响应体中包含
stackTrace字段(如"stack": ["at com.example.UserController.findById(UserController.java:23)"]),仅用于前端开发者工具查看 - 生产环境:响应体完全剔除 stack 相关字段,只保留
code、message和唯一 traceId(用于日志关联) - 注意:即使开发环境返回堆栈,也不应直接返回
e.printStackTrace()字符串,而应解析e.getStackTrace()数组后格式化为 JSON 数组,避免 XSS 风险
日志记录也需环境适配
日志不是“全有或全无”,而是分级输出:
- 所有环境都记录 ERROR 级别日志,但生产环境日志中敏感字段(如数据库地址、用户凭证、完整路径)必须脱敏
- 开发环境可额外打印
log.error("Dev-only full trace", e),利用 SLF4J 的参数化日志避免字符串拼接开销 - 禁用生产环境的 DEBUG/TRACE 日志级别,防止意外泄露调用链细节(如通过
logging.level.root=WARN控制)
配合 application-{env}.yml 做细粒度控制
可在不同配置文件中定义开关,增强灵活性:
-
application-prod.yml中设置app.exception.show-stack: false -
application-dev.yml中设为true - 在异常处理器中用
@Value("${app.exception.show-stack:false}")注入布尔值,比 profile 判断更直观、易测试 - 该方式支持灰度发布场景:例如某台机器临时开启堆栈,只需修改其配置,无需重启整个集群
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










