log4j2: Проблема с перенастройкой логгеров во время выполнения - PullRequest
0 голосов
/ 06 августа 2020

Это относится к log4j2 версии 2.13.2 .

Мы используем API, который поставляется с собственным файлом конфигурации регистратора, например - log4j2_api. xml. Как разработчик приложения, у нас есть собственный log4j2. xml в пути к классам.

API, который мы используем, внутренне загружает объекты log4j2 (регистраторы и приложения) из log4j2_api . xml. Похоже, когда это происходит, наша собственная конфигурация из log4j2. xml перезаписывается log4j2_api. xml, и наше приложение больше не создает журналов.

Вот краткая последовательность событий -

  1. Приложение запускается и log4j2. xml загружается из пути к классам.
  2. Приложение продолжается с соответствующим ведением журнала, как ожидалось.
  3. Произойдет первый вызов API. Внутренне загружается log4j2_api. xml, и ведение журнала API происходит в соответствии с его конфигурацией.
  4. Приложение получает необходимые данные от API и продолжает работу, но без желаемой регистрации.

Мое ожидание здесь: - если в новой конфигурации обнаружены предварительно загруженные (по начальной конфигурации) регистраторы / приложения, они должны быть обновлены, а другие должны остаться нетронутыми. И, конечно же, должны быть добавлены недавно настроенные регистраторы / приложения.

Правильно ли это понимание?

Заранее спасибо.

Файлы конфигурации -

log4j2. xml

<Configuration status="warn">
    <Appenders>
        <RollingFile name="applicationAppender" fileName="sample-log-executor-2008.log" filePattern="sample-log-executor-2008-%i.log">      
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB" />
            </Policies>
        </RollingFile>
        
        <Console name="console_window" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    
    <Loggers>
        <Logger name="com.abc.samplecode" level="trace" additivity="false">
            <appender-ref ref="applicationAppender" level="trace" />
        </Logger>

        <Root level="error" additivity="false">
            <appender-ref ref="console_window" />
        </Root>
    </Loggers>
</Configuration>

log4j_api. xml

<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d %-5p [%t] %C (%F:%L) - %m%n" />
        </Console>
        
        <RollingFile name="xyzAPIAppender" fileName="xyzAPILog.log"
            filePattern="xyzAPILog-%i.log">
            <PatternLayout
                pattern="%d{MMM dd yyyy HH:mm:ss.SSS} %-5p [%t] (%27F:%-5L) - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    
    <Loggers>
        <logger name="com.xyz.api" level="warn"
            additivity="false">
            <AppenderRef ref="xyzAPIAppender" />
        </logger>
    </Loggers>
</Configuration>

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Из того, что вы описываете, библиотека, которую вы потребляете, вызывает Log4j для настройки с ее собственной конфигурацией. Это очень грубо, так как вызывает проблему, с которой вы столкнулись. Когда он загружает свою конфигурацию, он перенастраивает Log4j, чтобы ваша конфигурация была удалена.

Вам нужно получить больше информации о библиотеке, которую вы вызываете, и узнать, как заставить ее прекратить повторную инициализацию Log4j.

1 голос
/ 06 августа 2020

Я подозреваю, что в вашем пути к классам отсутствует ядро ​​jar log4j2.

Пожалуйста, смотрите арку для более подробной информации http://logging.apache.org/log4j/2.x/faq.html#which_jars

...