Как пошагово перенастроить в log4j2? - PullRequest
0 голосов
/ 29 февраля 2020

Я делаю работу по обновлению с log4j1.2.17 до log4j2.12.0 . Мне нужно реализовать функции, которые мы сделали с log4j1.x. Однако у меня возникли некоторые серьезные проблемы:

  1. В log4j1.x после расширения класса FileAppender я могу использовать org.apache.log4j.FileAppender#setFile для изменения текущего выходного файла. Как установить файл в log4j2?

  2. В log4j1.x, с помощью org.apache.log4j.xml.DOMConfigurator#doConfigure я могу выполнить настройку постепенно . Как это сделать в log4j2? Сценарий выглядит следующим образом: во-первых, я построил конфигурацию basi c log4j2 (макет приложения logger) с API. Затем я хочу использовать файл log4j2-new. xml для обновления конфигурации постепенно на основе предыдущей конфигурации.

update :

Для вопроса 2 фон выглядит следующим образом: я настраиваю систему ведения журнала basi c с несколькими XML. Однако есть еще один модуль, называемый reportService , который необходим для программного создания некоторых регистраторов для записи данных отчета в файлы. Система ведения журналов basi c должна поддерживать горячее развертывание, что означает, что необходимо обновлять регистратор, когда xml меняет без удаления регистраторов, созданных reportService . Я прочитал руководство из log4j2. И я попробовал CompositeConfiguration, но, похоже, класс не может взять конфиг из ((LoggerContext) LogManager.getContext(false)).getConfiguration() в качестве параметра. Я думаю, что причина в том, что CompositeConfiguration не может использовать конфигурацию с именем initialize(). Вот пример (я использую log4j2-base. xml для программного моделирования создания регистраторов)

public class LoadXmlConfigurationTest {

    public static final String BASE_CONFIG = "log4j2-base.xml";
    public static final String EXT_CONFIG = "log4j2-ext.xml";

    @Test
    public void loadXmlConfigTest() {
        System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, BASE_CONFIG);

        Configuration baseConfig = ((LoggerContext) LogManager.getContext(false)).getConfiguration();

        final Configuration extConfig = loadConfiguration("log4j2-ext.xml");

        List<AbstractConfiguration> configs = new ArrayList<>();

        configs.add((AbstractConfiguration) baseConfig);
        configs.add((AbstractConfiguration) extConfig);

        CompositeConfiguration compositeConfiguration = new CompositeConfiguration(configs);

        ((LoggerContext) LogManager.getContext(false)).reconfigure(compositeConfiguration);
        Logger logger = LogManager.getLogger("EXT");
        Logger rootLogger = LogManager.getRootLogger();
        logger.error("ext logger info");
        rootLogger.error("root logger info");
    }


    private Configuration loadConfiguration(final String resourcePath) {
        try (final InputStream in = getClass().getClassLoader().getResourceAsStream(resourcePath)) {
            return new XmlConfiguration(new LoggerContext("test"), new ConfigurationSource(in));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Вывод выглядит следующим образом, baseConfig не работает:

2020-03-01 10:26:41,394 main ERROR No logging configuration
EXT | 2020-03-01 10:26:41,411 ERROR [main] (LoadXmlConfigurationTest.java:50) - ext logger info
10:26:41.413 [main] ERROR  - root logger info

log4j2-base. xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
    <Console name="ROOT" target="SYSTEM_OUT">
        <PatternLayout>
            <pattern>ROOT | %d %-5p [%t] %C{2} (%F:%L) - %m%n</pattern>
        </PatternLayout>
    </Console>
</Appenders>


<Loggers>
    <Root level="debug">
        <AppenderRef ref="ROOT" />
    </Root>
</Loggers>
</Configuration>

log4j2-ext. xml

log4j
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="EXT" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>EXT | %d %-5p [%t] (%F:%L) - %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>


    <Loggers>
        <Logger name="EXT" level="DEBUG" additivity="false">
            <AppenderRef ref="EXT" />
        </Logger>
    </Loggers>
</Configuration>

1 Ответ

1 голос
/ 01 марта 2020

При слишком частой миграции с Log4j 1 на Log4j 2 люди просто смотрят на настройки, сделанные для Log4j 1, и пытаются перенести их на Log4j 2. Это абсолютно неправильный подход.

При миграции с Log4j 1 to Log4j 2 ваш первый шаг должен состоять в том, чтобы собрать требования к ведению журнала. Если у вас есть такие, вы должны взглянуть на то, как Log4j 2 может это реализовать. Log4j 2 содержит много функций, которые не были доступны в Log4j 1, и его архитектура сильно отличается.

Также было бы очень сложно ответить на ваши вопросы выше, не зная, что вы пытаетесь выполнить sh. Вы пытаетесь изменить имя файла во время работы конфигурации? В Log4j 2 имя файла является неизменным в File Appender, потому что оно не может быть изменено потокобезопасным способом. Однако вы можете создать новую конфигурацию с новым FileAppender, настроенным для указания на новый файл.

Что вы подразумеваете под «постепенно»? Log4j 2 позволяет программно создавать конфигурацию несколькими различными способами. Страница Programmati c конфигурации в Log4j описывает, как это сделать. Что означает, что вы хотите использовать log4j2-new. xml для постепенного обновления конфигурации? Вы хотите добавить в конфигурацию или заменить ее? Log4j позволяет составные конфигурации, так что вы можете объединить конфигурации. Сначала вы должны создать свою конфигурацию, затем XMLConfiguration, объединить их вместе в CompositeConfiguration и затем передать ее одному из методов Configurator классов Configurator. Однако это может затруднить вам автоматическую настройку c в случае необходимости изменения файла конфигурации.

Часто люди обнаруживают, что им не требуется программная c настройка. Log4j предоставляет Appenders, которые динамически создают другие appenders, PatternSelector, который позволяет форматировать записи на основе атрибутов в событии журнала, Lookups, которые позволяют динамически вводить значения в конфигурацию во время выполнения, и другие функции.

Итак, еще раз, прежде чем приступить к переходу с Log4j 1 на Log4j 2, сначала оцените ваши требования, а затем посмотрите на существующие функции Log4j 2, чтобы определить, кому их удовлетворить. Если у вас есть вопросы по этому поводу, не стесняйтесь задавать их здесь, в Stackoverflow или по электронной почте в список рассылки пользователя Log4j.

...