У нас есть требование программно добавить приложение для сменяющихся файлов при запуске приложения. А также мне нужно удалить существующие приложения (которые настраиваются из файла log4j2. xml). Я пробовал разные подходы, но у меня ничего не вышло.
Проблемы, с которыми я сейчас сталкиваюсь:
- Некоторые журналы все еще поступают в старые приложения.
- Если я обновлю уровень регистратора (с INFO до DEBUG ) для любого пакета регистратора, эти вещи также не будут работать должным образом.
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
Configuration configuration = loggerContext.getConfiguration();
//Removing the existing appenders
configuration.getAppenders().keySet().forEach(((AbstractConfiguration)configuration)::removeAppender);
String rollingAppenderName = "RollAppender";
RollingFileAppender rollingFileAppender = RollingFileAppender.newBuilder()
.setConfiguration(configuration)
.setName(rollingAppenderName)
.setLayout(layout)
.withFileName("/tmp/test.log")
.withFilePattern("/tmp/test.%i.log")
.withPolicy(SizeBasedTriggeringPolicy.createPolicy("10MB"))
.build();
rollingFileAppender.start();
configuration.addAppender(rollingFileAppender);
/*
* Updating appenders of all the loggerConfigs configured in the log4j2 config file.
* */
LoggerConfig rootLogger = configuration.getRootLogger();
Map<String, LoggerConfig> loggerMap = configuration.getLoggers();
for (LoggerConfig loggerConfig : loggerMap.values()) {
AppenderRef appenderRef = AppenderRef.createAppenderRef(rollingAppenderName, loggerConfig.getLevel(), loggerConfig.getFilter());
AppenderRef[] refs = new AppenderRef[]{appenderRef};
if (Objects.equals(loggerConfig.getName(), rootLogger.getName())) {
loggerConfig = LoggerConfig.RootLogger.createLogger("true", loggerConfig.getLevel(),
Boolean.toString(loggerConfig.isIncludeLocation()), refs, null, configuration, loggerConfig.getFilter());
loggerConfig.addAppender(rollingFileAppender, loggerConfig.getLevel(), loggerConfig.getFilter());
} else {
loggerConfig = LoggerConfig.createLogger(true, loggerConfig.getLevel(), loggerConfig.getName(),
Boolean.toString(loggerConfig.isIncludeLocation()), refs, null, configuration, loggerConfig.getFilter());
}
configuration.removeLogger(loggerConfig.getName());
configuration.addLogger(loggerConfig.getName(), loggerConfig);
}
loggerContext.updateLoggers();