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

时间:2013-10-20 11:45:11

标签: java logging log4j slf4j log4j2

我无法configure 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配置。

使用的依赖项:

1 个答案:

答案 0 :(得分: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!");
    }
}

使用时会中断

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

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

以下

也将起作用
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");
    }
}

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