java应用中敏感信息日志脱敏需全链路防控:框架层用logback自定义converter/filter全局替换、业务层提前掩码参数、mdc中存入即脱敏、静态检查与ci卡点拦截明文输出。

Java 应用中,密码等敏感信息绝不能明文出现在日志里。核心思路是:在日志输出前主动替换、拦截或过滤敏感字段,而不是依赖事后清理。
日志框架层统一脱敏(推荐)
以 Logback 为例,可通过自定义 Converter 或 Filter 实现全局脱敏。比如编写一个 MaskingPatternLayout,识别日志消息或 MDC 中的 key(如 password、pwd、token),将其值替换为 ***。
- 支持正则匹配键名和值内容,适配不同命名习惯(
userPwd、auth_token等) - 对 JSON 字符串做轻量解析(不全量解析,只找键值对),避免破坏日志结构
- 配置示例:
%replace(%msg){'("password"\s*:\s*"[^"]*)[^"]*("[^}]*})', '$1***$2'}(适用于简单 JSON 场景)
业务代码中提前处理日志参数
在调用 logger.info() 前,手动对敏感变量做掩码。适合关键路径或高敏感操作。
- 不要写
logger.info("login user: {}, pwd: {}", username, password) - 改为
logger.info("login user: {}, pwd: ***", username)或封装工具方法LogUtil.mask(password) - 对对象日志(如
logger.debug("req: {}", request)),重写toString()方法,对敏感字段返回"***"
利用 MDC 隔离并控制敏感上下文
将敏感信息放入 MDC 时即脱敏,后续所有日志自动携带掩码值,避免误打。
-
MDC.put("authToken", mask(token));而非MDC.put("authToken", token); - 配合 Logback 的
%X{authToken}输出,确保日志模板中引用的是已脱敏值 - MDC 清理要及时,防止跨请求污染
静态检查与上线前卡点
光靠运行时防护不够,需结合工程规范堵住源头。
- 使用 SonarQube 或自定义 PMD 规则,扫描
logger.*调用中是否直接拼接敏感变量 - CI 流程中加入日志关键字扫描(如
password=.*、"pwd":"[^"]*"),发现即阻断 - 测试环境开启全量 DEBUG 日志,人工抽检典型场景(登录、支付、令牌刷新)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











