Java日志敏感信息自动脱敏核心是日志打印前拦截并替换,推荐用Logback自定义Converter、MDC字段级脱敏或Filter预处理,配合通用工具类统一规则。

Java 日志中对手机号、身份证号等敏感信息自动脱敏,核心思路是:在日志打印前拦截原始数据,识别并替换敏感字段。不建议手动在每个 log 语句里写脱敏逻辑(易遗漏、难维护),推荐通过日志框架的扩展能力实现统一、可配置的自动脱敏。
使用 Logback 的 PatternLayout + 自定义转换器
Logback 支持自定义转换器(Converter),可在日志格式化阶段动态处理日志内容:
- 编写一个继承
ClassicConverter的类,例如DesensitizeConverter - 重写
convert()方法:提取日志事件中的 message 或 argument,用正则匹配手机号(11位数字,以1开头)、身份证号(15或18位,含X),替换成脱敏格式(如 138****1234、110101****001X) - 在
logback.xml中注册该转换器,并在%replace或自定义 pattern 中引用,例如:%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %desen{%msg}
借助 MDC 实现字段级精准脱敏
若敏感信息来自特定字段(如用户对象的 idCard、phone),可在打日志前将脱敏后值存入 MDC(Mapped Diagnostic Context):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 业务代码中:
MDC.put("safePhone", DesensitizationUtil.maskPhone(user.getPhone())); - logback 配置中直接输出:
%X{safePhone} - 优势:只脱敏明确传入的字段,不影响其他日志内容;适合 Controller/Service 入参统一处理
结合日志框架的 Filter 机制预处理日志事件
Logback 提供 Filter(如 EvaluatorFilter),也可自定义 Filter 在日志事件进入 appender 前修改其内容:
立即学习“Java免费学习笔记(深入)”;
- 继承
Filter<ILoggingEvent>,在decide()中获取event.getFormattedMessage()或event.getArgumentArray() - 对参数数组逐个判断类型(String),再按规则脱敏;或对完整 message 做正则替换
- 注意:修改
event对象需确保线程安全(避免复用 event 实例),建议 deep copy 后处理
通用脱敏工具类建议(配合上述任一方式使用)
封装可复用的脱敏方法,保持规则统一:
- 手机号:保留前3后4位,中间用 * 替代 →
138****1234 - 身份证号:15位保留前6后3;18位保留前6后4,末位X不转小写 →
110101****001X - 支持传入 null/空字符串/非法格式,返回原值或空字符串,避免 NPE
- 正则示例:
手机号:"^1[3-9]\d{9}$"
身份证:"^\d{15}(\d{2}[0-9Xx])?$"

















