Уровень журналирования Log4j2 становится различным в Java 8 и Java 11 - PullRequest
0 голосов
/ 14 января 2019

Log4j2 выпуск 2.11.0 / 2.11.1 отлично работал в приложениях Java 8, но не в Java 11

Вот пример log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="log-path">C:\\MyTestXXXX\\EnterpriseLogs</Property>
    </Properties>

    <Appenders>
        <RollingFile name="MyTestOnly" fileName="${log-path}\ServerLog.log" filePattern="${log-path}\ServerLog_%d{yyyy-MM-dd}_%i.log" append="true">
            <PatternLayout>
                <Pattern>[#%d{HH:mm:ss}|%p|%m#]%n</Pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="0 0 0 * * ?" evaluateOnStartup="true"/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy/>
        </RollingFile>  
    </Appenders>

    <Loggers>
        <Logger name="OnlyLOG" additivity="true">
            <AppenderRef ref="MyTestOnly" level="ALL" />
        <Logger>

        <Root level="ALL" />
    </Loggers>
</Configuration>

В исходном коде Java я сделал это: import org.apache.logging.log4j. *; import org.apache.logging.log4j.core.Logger;

...

// Get org.apache.logging.log4j.core.Logger
Logger logger = (Logger) LogManager.getLogger("OnlyLOG");
logger.log(Level.forName("INFO", 600), "Log this text now!", new Exception("xxxxxx"));

Работая в Java 8, я вижу, что serverLog.log имеет контент, и это хорошо. Запущенный в Java 11, нет журнала.

В ходе дальнейшего изучения (отладки) я нашел эту строку интересной:

Logger logger = (Logger) LogManager.getLogger("OnlyLOG");

После выполнения в Java 8 logger был что-то вроде «ALL in 2f333739», и log был в порядке. Но в Java 11 logger был что-то вроде «ОШИБКА в 2f333739» и не было журнала. Очевидно, уровень стал «ОШИБКА» вместо «ВСЕ».

Итак, я пробую это в Java 11:

Level loggerLevel = logger.getLevel(); // Obviously it is ERROR level
logger.log(loggerLevel, "Log this text now!", new Exception("xxxxxx"));

Журнал произошел в консоли (скорее всего, прошел через Root), а не в файле ServerLog.log, который был настроен в log4j2.xml для регистратора OnlyLOG.

Итак, что вызвало разницу в уровне между Java 8 и Java 11? Другими словами, что следует изменить, чтобы в Java 11 журнал мог работать так же, как в Java 8?

1 Ответ

0 голосов
/ 17 января 2019

Проблема решена. Вот причина. Я использовал новую Eclipse IDE для запуска Java 11, при добавлении проекта я добавил папку lib в путь к классам, так как log4j2.xml находился в папке lib. Теперь я проверил конфигурацию IDE во второй раз и обнаружил, что папка lib не находится в пути к классам. После второй попытки конфигурация в порядке, и ведение журнала становится нормальным.

Я провел второй тест, добавив новый проект в Eclipse IDE. Интересно, что при добавлении папки lib в путь к классу, действительно, мне пришлось попробовать дважды, поскольку в первый раз она не была добавлена. Кстати, компьютер работает под управлением Windows 10. Этого не произошло при использовании компьютера под управлением Windows 7.

Несмотря на это, Log4j2 прекрасно работает как в Java 8, так и в Java 11.

...