如何以编程方式验证 log4j 2 是否已正确配置?

Jos*_*nez 5 java log4j2

通过阅读 log4j 2文档,如果适当的配置文件在类路径中,则预计将加载配置。但我需要确定配置文件已正确处理。有没有一种方法可以验证我希望加载的配置文件是否确实找到并成功加载?

我正在编写将被其他开发人员使用的代码,可能是我们正在编写的库中不可或缺的 log4j 2 没有正确配置,因为文件不在类路径中或配置错误。如果 log4j 2 配置不正确,我必须停止对我们库的进一步处理,它必须吐出重大错误,并且必须对此进行大处理。我不能让代码继续。所以最重要的是,我需要知道 log4j 2 正确处理了预期的配置文件。

另外,我更喜欢使用 log4j 2 API 而不是 Core 库,但如果 Core 是唯一的方法,那就这样吧。

Rem*_*pma 6

您可以仅使用 api进行一些StatusListener验证:您可以使用StatusLogger. StatusLogger 由 Log4J 内部使用来记录 Log4J 内部的详细信息。大多数内部日志记录与配置相关。

例如:

public class HaltingStatusListener implements StatusListener {
    public Level getStatusLevel() {
        return Level.ERROR;
    }
    public void log(StatusData data) {
        throw new BigDealException("Internal log4j error detected: "
                + data.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

但这可能不足以满足您的需求。您可以检查的另一件事:

LoggerContext context = LogManager.getContext();
if (context instanceof SimpleLoggerContext) {
    throw new BigDealException(
            "Log4j did not find config file & uses default setup");
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多细节并验证附加程序/记录器等,您将需要使用核心类。在这种情况下,请向 log4j-user 邮件列表发送消息,让其他团队成员参与进来。

更新:Log4J 团队当前假设 Log4J 初始化失败并不严重,不应停止应用程序。您可以请求增强功能,例如,如果未找到核心 jar 或未找到配置文件,log4j 会停止应用程序(引发异常)。您可以为此提出 Jira 票证或在邮件列表上询问。


Ant*_*iuc 5

另一种可能的选择是直接检查StatusLogger

StatusLogger.getLogger().getStatusData()
        .stream()
        .filter(s -> s.getLevel().isMoreSpecificThan(Level.ERROR))
        .forEach(s ->
            System.out.println(s.getFormattedStatus())
        );
Run Code Online (Sandbox Code Playgroud)

这将打印所有内部 log4j2状态以及错误级别ERRORFATAL