【日志安全必看】Log4j 2 实现敏感信息脱敏,防止密码泄露!

作者:唐叔在学习
专栏:问题百宝箱
关键词标签: #日志脱敏 #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 机制实现日志敏感信息脱敏。总结一下关键点:

  1. 安全性提升:避免敏感信息明文打印,符合数据安全法规;
  2. 自动化处理:无需修改业务代码,通过配置即可实现;
  3. 灵活可扩展:支持正则表达式,可自定义多种脱敏规则;
  4. 兼容性强:适用于任何使用 Log4j 2 的 Java 项目。

我是唐叔,一名热爱技术和分享的程序员。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!我们下期再见 👋

评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐叔在学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值