Log4j2: программно удалить существующие приложения и динамически добавить новый RollingFileAppender для всех регистраторов. - PullRequest
0 голосов
/ 04 августа 2020

У нас есть требование программно добавить приложение для сменяющихся файлов при запуске приложения. А также мне нужно удалить существующие приложения (которые настраиваются из файла log4j2. xml). Я пробовал разные подходы, но у меня ничего не вышло.

Проблемы, с которыми я сейчас сталкиваюсь:

  1. Некоторые журналы все еще поступают в старые приложения.
  2. Если я обновлю уровень регистратора (с 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();

1 Ответ

0 голосов
/ 04 августа 2020

Выбранный вами подход неверен. Попытка манипулировать существующей конфигурацией таким образом, как вы, приведет к потере событий журнала, пока вы возитесь с конфигурацией. Вместо этого создайте новую конфигурацию и после ее создания замените старую конфигурацию новой.

...