Проблема в том, что мне не удается правильно обновить RollingFileAppenders LoggerContext. Кажется, что они создаются правильно, и тогда я также, кажется, могу правильно заменить старый Appender на новый, но когда я действительно выполняю какой-нибудь log.debug(...) или что-то еще, По какой-то причине конфигурация всегда возвращается к старым Appenders. Затем журналирование никуда не ведет, даже в файл, для которого ранее был установлен Appender.
Я уже просматривал документацию, но, похоже, это говорит о том, что то, что я делаю, должно работать. .
Сейчас я делаю вот что:
Код: Выделить всё
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Configuration config = context.getConfiguration();
RollingFileAppender oldAppender = config.getAppender(appenderName);
if (oldAppender != null) {
oldAppender.stop();
if (!newBasePath.endsWith("\\")) {
newBasePath += "\\";
}
if (!logFileName.endsWith(".log")) {
logFileName += ".log";
}
String newFileName = newBasePath + logFileName;
String newFilePattern = newBasePath + "model_%d{yyyyMMdd}-%i.log.gz";
// Create a new RollingFileAppender with the new file path, reusing the old configuration
RollingFileManager manager = oldAppender.getManager();
RollingFileAppender newAppender = RollingFileAppender.newBuilder()
.setName(appenderName)
.withFileName(newFileName)
.withFilePattern(newFilePattern)
.withAppend(manager.isAppend())
.withStrategy(manager.getRolloverStrategy())
.withPolicy(manager.getTriggeringPolicy())
.setLayout(oldAppender.getLayout())
.withLocking(manager.isLocking())
.build();
newAppender.start();
//...
Код: Выделить всё
//remove old appender from Config and Loggers
...
((PropertiesConfiguration) config).removeAppender(appenderName);
.getLoggers().values().forEach(l -> l.removeAppender(appenderName));
//add rebuilt (new) appender to Config and Loggers
config.addAppender(newAppender);
.getLoggers().values().forEach(l -> l.addAppender(newAppender, l.getLevel(), l.getFilter()));
context.updateLoggers();
}
На этом снимке экрана показан регистратор перед переходом на новый Appender (обратите внимание на старый путь к файлу журнала в переменных):Перед установкой нового Appender
Это после выполнения следующих нескольких строк (обратите внимание на новые пути к файлам журнала):
После установки нового Appender
Сразу после этого я тестирую Appender через какой-то log.debug(...), но когда я отлаживаю код, я вижу, что Appenders вернулись к старому файлу путь:
Вызов log.debug(...) сразу после обновления Appender
Я подозреваю, что он каким-то образом прибегает к некоторой конфигурации по умолчанию, выведенной из log4j2 .properties и не затронут внесенными мной изменениями.
Уровень отладки не должен быть проблемой, поскольку все уровни в log4j2.properties установлены на DEBUG.
Подробнее здесь: https://stackoverflow.com/questions/790 ... at-runtime
Мобильная версия