解决 Log4j2 配置问题:尽管在 log4j2.xml 中添加 @ConverterKeys({"mask"}) %mask,但应用程序服务器中的数据屏蔽失败

问题描述 投票:0回答:1

我需要解决应用程序日志配置的紧急问题。我们正在尝试使用 log4j2.xml 文件中 Log4j2 的自定义模式转换器 %mask 来实现数据屏蔽。但是,我们遇到了一个问题,即在将应用程序部署到生产服务器时未应用屏蔽。如果我们从 log4j2.xml 中删除 %mask,则部署成功,但未应用屏蔽。

为了提供一些上下文,我们按照 Log4j2 文档中的建议将 @ConverterKeys({"mask"}) 注释添加到 %mask 自定义模式转换器中。此设置在我们的本地开发环境中运行得很好,但是当我们将应用程序部署到生产服务器时,数据屏蔽功能无法按预期运行。

我们彻底审查了 %mask 自定义模式转换器的实现,并确保其正确实现并与正在使用的 Log4j2 版本兼容。此外,我们还检查了任何依赖项冲突,并确保在部署期间所有必要的依赖项都包含在应用程序的类路径中。

Java 类:

@Plugin(name = "MaskedPatternConverter", category = "Converter")
@ConverterKeys({"mask","masked"})
public class MaskedPatternConverter extends LogEventPatternConverter {
    public void format(LogEvent event, StringBuilder outputmsg) {
        String message = event.getMessage().getFormattedMessage();
        // Implement your masking logic here
        String maskedMessage = maskSensitiveData(message);
        
        if (message.toLowerCase().contains("email") ||
            message.toLowerCase().contains("adharcard") ||
            message.toLowerCase().contains("creditcard")) {
            String mask = maskEmailandAdhar(message);
            outputmsg.append(mask);
        } else {
            outputmsg.append(maskedMessage);
        }
    }
}

log4j2.xml:

<Appenders>
    <Routing name="AppzillonServerLogFile">
        <Routes pattern="$${ctx:AppId}/$${ctx:UserId}/">
            <Route>
                <RollingFile name="MainLogFile" fileName="${loghome}/${ctx:AppId}/${ctx:UserId}/MainLogFile.log"
                             filePattern="${loghome}/${ctx:AppId}/${ctx:UserId}/%d{dd-MM-yyyy}-MainLogFile-%i.log.zip">
                    <PatternLayout>
                        <Pattern>%d %p %-40c{1.} [$${ctx:reqRef}] [$${ctx:UserId}] %mask{email}{pass}{aadhaar}%n
                        </Pattern>
                    </PatternLayout>
                </RollingFile>
            </Route>
        </Routes>
    </Routing>
</Appenders>
java spring logging log4j2 masking
1个回答
0
投票

我不确定你的插件是如何加载的。 在此输入链接描述

我的问题是,以前可以,但现在不支持包裹扫描。 所以它不会再在那里找到我的插件了。

StatusConsoleListener 首先加载,我找不到解决方法。

通过在调试时在其中放置断点来确保您的插件实际上在运行时加载,您可以在下面的静态方法和格式方法上执行此操作。

此外,所有转换器必须具备以下条件:

public static MaskedPatternConverter  newInstance(String[] options)

© www.soinside.com 2019 - 2024. All rights reserved.