以编程方式加载Log4j2配置文件

Has*_*imR 33 java logging log4j2

我想从我的应用程序以编程方式加载Log4j2 XML配置文件.

试过这个:

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
Configurator.initialize(null, source);
Run Code Online (Sandbox Code Playgroud)

还有这个:

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source);
ConfigurationFactory.setConfigurationFactory(factory);
Run Code Online (Sandbox Code Playgroud)

但是没有任何效果.

小智 38

对于最新版本的log4j,这里应该用于加载外部log4j2.xml:

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
Run Code Online (Sandbox Code Playgroud)

  • 你应该能够简单地使用`Configurator.initialize(null,"fileName");` (16认同)
  • 为什么将 null 传递给 Configurator.initialize() ? (4认同)

dco*_*led 18

如果您有一个主要入口点,此代码段可能会为您省去一些麻烦.必须在创建任何记录器之前触发set属性调用.此方法适用于类路径上的文件.

public class TestProcess {
    static {
        System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
    }

    private static final Logger log = LoggerFactory.getLogger(TestProcess.class);

}
Run Code Online (Sandbox Code Playgroud)


Has*_*imR 16

我自己找到了答案.有人可能觉得它很有用.

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
Run Code Online (Sandbox Code Playgroud)


sil*_*ver 6

下面为我​​工作,带SLF4J包装的Log4j2 :

解决方案1:

public class MyClass {

    static {
        try {
            InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml");
            ConfigurationSource source = new ConfigurationSource(inputStream);
            Configurator.initialize(null, source);
        } catch (Exception ex) {
            // Handle here
        }
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); // LogManager if not using SLF4J

    public void doSomething() {
        LOGGER.info(...)
    }

}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

static {
    File log4j2File = new File("C:/path/to/log4j2.xml");
    System.setProperty("log4j2.configurationFile", log4j2File.toURI().toString());
}
Run Code Online (Sandbox Code Playgroud)

需要toURI()遵循File URI Scheme格式,否则会抛出异常MalformedURLException

资料来源: