作者:唐叔在学习
专栏:问题百宝箱
关键词标签:#日志脱敏#Log4j2#数据安全#正则表达式#RewritePolicy#敏感信息保护#Java开发#网络安全法
引言:为什么需要日志脱敏?
随着《网络安全法》和《数据安全法》的落地,数据安全已成为开发者必须重视的问题。日志中经常不可避免地会出现用户手机号、身份证、密码等敏感信息。一旦泄露,不仅用户隐私受到威胁,企业也可能面临法律风险和经济损失。
手动过滤?太容易遗漏!
字符串替换?太麻烦!
是时候通过配置 Log4j 2,实现自动化、可复用的日志脱敏机制了!
一、引入 Log4j 2 依赖
首先,确保你的项目中已经引入了 Log4j 2 的核心依赖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
</dependencies>
💡 提示:建议使用 2.15.0 及以上版本,以避免早期版本中存在的安全漏洞。
二、自定义敏感信息脱敏插件
我们通过实现 RewritePolicy 接口,自定义一个基于正则表达式的替换策略:
@Plugin(name = "RegexReplaceRewritePolicy",
category = Core.CATEGORY_NAME,
elementType = "rewritePolicy",
printObject = true)
public final class RegexReplaceRewritePolicy implements RewritePolicy {
private final Pattern regexPattern;
private final String replacement;
private RegexReplaceRewritePolicy(String regex, String replacement) {
this.regexPattern = Pattern.compile(regex);
this.replacement = replacement;
}
@Override
public LogEvent rewrite(LogEvent event) {
String originalMessage = event.getMessage().getFormattedMessage();
String modifiedMessage = regexPattern.matcher(originalMessage).replaceAll(replacement);
if (originalMessage.equals(modifiedMessage)) {
return event;
}
return new Log4jLogEvent.Builder(event)
.setMessage(new SimpleMessage(modifiedMessage))
.build();
}
@PluginFactory
public static RegexReplaceRewritePolicy createPolicy(
@PluginAttribute("regex") String regex,
@PluginAttribute("replacement") String replacement) {
return new RegexReplaceRewritePolicy(regex, replacement);
}
}
🔑 核心注解说明:
@Plugin:声明这是一个 Log4j 插件;@PluginFactory:标记工厂方法,用于从配置文件创建实例。
三、配置 log4j2.xml 使用脱敏策略
接下来是关键的一步:在 log4j2.xml 中配置我们刚才写的重写策略:
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n"/>
</Console>
<Rewrite name="RewriteSensitiveData">
<AppenderRef ref="Console"/>
<RegexReplaceRewritePolicy
regex="(?i)(password|pwd)=[^&\s]+"
replacement="$1=***"/>
</Rewrite>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RewriteSensitiveData"/>
</Root>
</Loggers>
</Configuration>
🧠 正则解释:
(?i)表示忽略大小写,
(password|pwd)匹配“password”或“pwd”,
[^&\s]+匹配直到遇到空格或&符号的内容。
四、效果演示
配置完成后,所有通过 Log4j 输出的日志都会自动进行脱敏处理。例如:
原始日志:
password=123456&user=admin
脱敏后日志:
password=***&user=admin
✅ 敏感信息被自动替换,其他内容保持不变,既安全又不影响日志可读性。

五、扩展:支持更多敏感字段
你可以在正则表达式中添加更多需要脱敏的字段,例如手机号、身份证、邮箱等:
<RegexReplaceRewritePolicy
regex="(?i)(password|pwd|phone|idcard)=[^&\s]+"
replacement="$1=***"/>
甚至可以为不同字段设置不同的替换规则,进一步提升日志的可读性与安全性。
六、总结
通过本文的介绍,你应该已经掌握了如何使用 Log4j 2 的 RewritePolicy 机制实现日志敏感信息脱敏。总结一下关键点:
- 安全性提升:避免敏感信息明文打印,符合数据安全法规;
- 自动化处理:无需修改业务代码,通过配置即可实现;
- 灵活可扩展:支持正则表达式,可自定义多种脱敏规则;
- 兼容性强:适用于任何使用 Log4j 2 的 Java 项目。
我是唐叔,一名热爱技术和分享的程序员。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!我们下期再见 👋
1206





