【问题标题】:Unable to get loaded configuration after log4j2 initializationlog4j2初始化后无法获取加载配置
【发布时间】:2022-01-08 05:24:48
【问题描述】:

我创建了一个log4j2 配置文件,在初始化它之前,应用程序中已经存在一个LoggerContext。我正在停止它并开始初始化。我正在尝试加载配置文件,如下所示,但我无法看到加载的配置和FileAppenderConsoleAppender。它返回 DefaultConfiguration 和现有的 LoggerContext。 我尝试了多种方法来停止现有的LoggerContext,例如LoggerContext context = (LoggerContext) LogManager.getContext(true); context.stop();,但它似乎不起作用并且配置未加载。我正在使用 log4j 2.17.1。

    LoggerContext context = (LoggerContext) LogManager.getContext(true);
    Configurator.shutdown(context);
    try {
      uri = new URI(getResourceFromBundle("org.example.loggingframework", "resources/iceLog4j2.xml").toString());   
      InputStream is = new FileInputStream(uri.getPath());
      ConfigurationSource source = new ConfigurationSource(is);
      LoggerContext ctx = (LoggerContext) LogManager.getContext(true);
      ctx.stop();
      Configuration config = ConfigurationFactory.getInstance().getConfiguration(ctx, source);
      ctx.start(config);
      LoggerContext loggerContext = (LoggerContext) LogManager.getContext(true);
      catch (URISyntaxException | IOException e) {     
      e.printStackTrace();     
    }

【问题讨论】:

    标签: java logging log4j2


    【解决方案1】:

    您的代码中有几个错误:

    1. 您正在检索错误的上下文:LogManager.getContext(true) 等同于 LogManager.getContext(),在其 Javadoc 中有一个很好的警告:

      警告 - 此方法返回的 LoggerContext 可能不是用于为调用类创建 LoggerLoggerContext

      请改用LogManager.getContext(false),除非您知道自己在做什么。

    2. 您创建了一个Configuration 对象,但您没有使用它。打电话

      context.reconfigure(config);
      
    3. 实际上没有必要再次停止和启动相同的上下文。您可以重新配置正在运行的上下文。

    备注:你的代码可以换成简单的:

    Configurator.reconfigure(uri);
    

    (见Javadoc)。

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2011-03-30
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多