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

Pio*_*ler 1 java logging log4j slf4j log4j2

我不能配置Log4j2读取XML文件的配置在工作目录.

我试图设置系统属性,因为文档说:

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

使用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添加到我的类路径中并将其放在src目录中时,此配置才有效.我想通过编辑工作目录中的XML文件来允许编译后的lightweid配置.

使用的依赖项:

小智 5

对我来说很好.

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

它在你使用时会中断

static Logger logger = LogManager.getLogger(Runtimeconfig.class);
Run Code Online (Sandbox Code Playgroud)

在您的类中,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");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是你依赖于静态字段初始化执行的顺序.