Загружать файл конфигурации Log4j2 программно
Я хочу загрузить файл конфигурации Log4j2 XML из моего приложения.
Пробовал это:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
Configurator.initialize(null, source);
и это:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source);
ConfigurationFactory.setConfigurationFactory(factory);
Но пока ничего не работает.
Ответы
Ответ 1
Нашел ответ сам. Кто-то может найти это полезным.
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
Ответ 2
Для новейшей версии log4j, вот что должно работать для загрузки внешнего log4j2.xml
:
String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
Ответ 3
Если у вас есть одна основная точка входа, этот фрагмент кода может сэкономить вам определенную проблему. Вызов свойства set должен срабатывать до создания любых журналов. Этот подход работает с файлами в пути к классам.
public class TestProcess {
static {
System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
}
private static final Logger log = LoggerFactory.getLogger(TestProcess.class);
}
Ответ 4
Если вы используете веб-приложение Servlet 3.0, вы можете использовать Log4jServletContextListener и выполните следующие действия:
Напишите пользовательский LogContextListener
, который простирается от Log4jServletContextListener
, настройте его в web.xml
и отключите автоматическую инициализацию:
<listener>
<listener-class>com.example.LogContextListener</listener-class>
</listener>
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
В пользовательской LogContextListener
переписать contextInitialized
и установить расположение конфигурации
public void contextInitialized(ServletContextEvent event) {
/* Some logic to calculate where the config file is saved. For
* example you can read an environment variable.
*/
String pathToConfigFile = ... + "/log4j2.xml";
Configurator.initialize(null, pathToConfigFile);
super.contextInitialized(event);
}
Преимущество над настройкой местоположения непосредственно в web.xml
заключается в том, что
вы можете вычислить путь на основе некоторой дополнительной информации и получить доступ к log4j2.xml, даже если это вне вашего пути к классам.
Ответ 5
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
.start(new XmlConfiguration(new ConfigurationSource(
Resources.asByteSource(log4j).openStream(),
log4j)));