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

标签 java log4j2

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

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

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

最佳答案

您可以仅使用 API 进行一些验证: 您可以使用 StatusLogger 注册一个 StatusListener。 Log4J 在内部使用 StatusLogger 来记录 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());
    }
}

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

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

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

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

关于java - 如何以编程方式验证 log4j 2 是否已正确配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747875/

相关文章:

java - log4j2 不适用于 JAR

java - 如何将 log4j2 JMSAppender 与 ActiveMQ 结合使用

java - 无法在类 org.apache.logging.log4j.core.layout.JsonLayout 中为元素 JsonLayout 调用工厂方法

java - Windows 到 Linux 文件传输上的 JCifs 登录失败

java - 当路径/名称包含 Unicode 字符时如何运行可执行 JAR?

java - Cassandra一致性(节点离线时)

logging - 为什么 log4j2 在异步记录器中使用 LMAX Disruptor 而不是任何其他内置的非阻塞数据结构?

java - Axis 2 中 SOAP 消息的加密

java - 对于初学者来说最简单的对话框/消息框?

java - 使用 log4j2 和 mockito 断言日志消息