如何在Java中实现自定义的异常日志脱敏_敏感数据过滤实战

秋杰君_6994

秋杰君_6994

2026-03-09

1161人浏览

原创

Java中需脱敏的字段包括password、idCard、bankCard、phone、email等明确敏感字段,以及字段名或值匹配“pwd”“phone”等模式的字段;脱敏须在日志写入前完成,推荐通过Logback自定义Converter或JSON序列化层实现字段级过滤,避免误脱、漏脱及副作用。

如何在java中实现自定义的异常日志脱敏_敏感数据过滤实战

Java中哪些字段需要脱敏?先看日志里真正暴露的风险点

日志里直接打印 password、idCard、bankCard、phone、email 这类字段,是敏感数据泄露的高频入口。不是所有字符串都要模糊处理,比如 username 或 orderNo 通常可明文;但只要字段名或值符合常见敏感模式(如 11 位数字+连续出现“phone”,或含“pwd”“pass”“token”等子串),就得干预。

  • 脱敏逻辑必须在日志写入前完成,不能依赖 Logback 的 %replace 做正则替换——它只处理最终字符串,无法识别字段结构,容易误伤或漏脱
  • 不建议在业务代码里每处 log.info("user: {}", user) 都手动调用脱敏工具,维护成本高且易遗漏
  • 最小侵入方式:统一拦截日志参数,在 Object.toString() 或 JSON 序列化环节做字段级过滤

用Logback + 自定义Converter实现字段级脱敏

Logback 的 PatternLayout 支持自定义 Converter,能拿到原始日志参数对象(ILoggingEvent.getArgumentArray()),比纯文本替换更精准。

  • 继承 ClassicConverter,重写 convert() 方法,对每个参数递归检查是否为 Map / DTO / List,并按预设规则脱敏字段
  • 规则配置建议外置为 JSON 文件(如 log-sensitivedata.json),内容示例:
    {
    "User": ["password", "idCard"],
    "OrderRequest": ["payToken", "cardNo"]
    }
    
  • 注意 convert() 中不要触发对象的 getter 方法副作用(如 Hibernate 懒加载引发 N+1 查询),优先用反射读取 field.get(obj),跳过代理对象或 null 值

JSON序列化时脱敏比日志拦截更可靠?要看你用的是哪个库

如果项目已用 fastjson 或 jackson 输出结构化日志(如 ELK 场景),直接在序列化层控制更稳:

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
  • fastjson:用 @JSONField(serialize = false) 或全局 SerializeConfig.addFilter(),但注意 addFilter() 对泛型集合支持弱,List 里的 User 字段可能被跳过
  • jackson:推荐 @JsonInclude(JsonInclude.Include.NON_EMPTY) + 自定义 SimpleBeanPropertyFilter,配合 FilterProvider 动态绑定,能区分不同接口的日志级别(如支付接口全脱敏,查询接口仅脱敏 idCard)
  • 别在 toString() 里写脱敏逻辑——很多框架(如 Spring Boot Actuator)会调用它生成诊断信息,导致非日志场景也误脱敏

脱敏后日志还能查问题吗?保留可逆标识是关键

完全替换成 * 会让排查变得困难。比如 phone 脱敏成 138***1234 是合理方案,但 token 若只留前缀,需确保前缀足够区分(如 tkn_abc... → tkn_abc),否则多个请求日志看起来一模一样。

  • 避免使用哈希或加密——日志系统不带密钥,无法还原,也失去可读性
  • 对数据库主键类字段(如 userId),可改用 maskId(userId) 做固定长度混淆(如 123456 → 876543),既不可逆又保留分布特征
  • 所有脱敏函数必须线程安全,禁止用 SimpleDateFormat 或静态 StringBuilder,曾有线上事故因脱敏器内部缓存导致日志内容错乱

脱敏不是加个星号就完事,真正难的是在不破坏日志可读性、不影响性能、不引入新 bug 的前提下,让敏感字段在该消失的地方消失,该露头的地方还能认出来。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11457

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8582

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7372

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1476

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3009

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20271

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习