Обновление пути к файлу Log4J2 Appender во время выполненияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обновление пути к файлу Log4J2 Appender во время выполнения

Сообщение Anonymous »

Для проекта у меня есть программа, которая запускается несколько раз, и я хочу регистрировать каждый ее запуск в другом файле. У меня уже есть все необходимое для этого, например. переменная, содержащая предполагаемое место регистрации для конкретного запуска.
Проблема в том, что мне не удается правильно обновить 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();
//...
Это создаст новый Appender с теми же настройками, что и старый, за исключением места записи, которое я и предполагал. Я подтвердил это в отладчике.

Код: Выделить всё

//remove old appender from Config and Loggers
...
((PropertiesConfiguration) config).removeAppender(appenderName);
config.getLoggers().values().forEach(l -> l.removeAppender(appenderName));
//add rebuilt (new) appender to Config and Loggers
config.addAppender(newAppender);
config.getLoggers().values().forEach(l -> l.addAppender(newAppender, l.getLevel(), l.getFilter()));

context.updateLoggers();
}
При этом старый Appender удаляется из текущей конфигурации LoggerContext и вставляется новый. В отладчике я вижу, что это также работает так, как задумано.
На этом снимке экрана показан регистратор перед переходом на новый Appender (обратите внимание на старый путь к файлу журнала в переменных):Перед установкой нового Appender
Это после выполнения следующих нескольких строк (обратите внимание на новые пути к файлам журнала):

После установки нового Appender
Сразу после этого я тестирую Appender через какой-то log.debug(...), но когда я отлаживаю код, я вижу, что Appenders вернулись к старому файлу путь:

Вызов log.debug(...) сразу после обновления Appender
Я подозреваю, что он каким-то образом прибегает к некоторой конфигурации по умолчанию, выведенной из log4j2 .properties и не затронут внесенными мной изменениями.
Уровень отладки не должен быть проблемой, поскольку все уровни в log4j2.properties установлены на DEBUG.

Подробнее здесь: https://stackoverflow.com/questions/790 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»