如何通过运行时路径(工作目录)XML 文件而不是类路径配置 Log4j2



我无法将 Log4j2 配置为从工作目录中的 XML 文件中读取配置

我正在尝试设置系统属性,如文档所述:

Log4j 将检查"log4j.configurationFile"系统属性,并且, 如果设置,将尝试使用 与文件扩展名匹配的配置工厂

使用 Main 类静态初始值设定项块,也在 main 方法中,具有相对和绝对路径:

  • System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "E:/log4j2.xml");

  • System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "./log4j2.xml");

  • System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "log4j2.xml");

也用"log4j.configurationFile"而不是XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY,这些都不起作用。

仅当我通过将 XML 放入目录来将 XML 添加到我的类路径src此配置才有效。我想通过在工作目录中编辑XML文件来允许编译后的lightweid配置。

使用的依赖项:

  • log4j-core-2.0-beta9.jar
  • log4j-api-2.0-beta9.jar
  • log4j-slf4j-impl-2.0-beta9.jar
  • slf4j-api-1.7.5.jar
对我来说

效果很好。

public class Runtimeconfig {
    public static void main(String args[]) {
        System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "/home/peter/config/log4j2.xml");
        new LoggedClass().logMe();
    }
}

public class LoggedClass {
    static Logger logger = LogManager.getLogger(LoggedClass.class);
    public void logMe() {
        logger.info("I'm logged!");
    }
}

使用时会损坏

static Logger logger = LogManager.getLogger(Runtimeconfig.class);

在 main 方法所在的类中,因为静态字段首先初始化。

还将起作用的是以下内容

public class Runtimeconfig {
    static {
        System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "/home/peter/config/log4j2.xml");
    }
    static Logger logger = LogManager.getLogger(Runtimeconfig.class);
    public static void main(String args[]) {
        new LoggedClass().logMe();
        new Runtimeconfig().logger.info("I'm logged too");
    }
}

但是,您依赖于静态字段初始化执行的顺序。

最新更新