Как избежать вывода большого количества бесполезных логов в log4j2?

Я перемещаю проект из Weblogic в Tomcat и обнаружил, что существует проблема смешивания log4j и log4j2, когда проект использует Weblogic, но он нормально работает в Weblogic и нормально выводит необходимые журналы, включая журналы из org.apache. logging.log4j.LogManager и журналы из org.slf4j.LoggerFactory

Однако когда я использую Tomcat, консоль может выводить журналы только из org.apache.logging.log4j.LogManager, но не из org.slf4j.LoggerFactory.

Регистратор с использованием org.apache.logging.log4j.LogManager:

private static final Logger logger = LogManager.getLogger(WebConfig.class);

Регистратор с использованием org.slf4j.LoggerFactory:

private final Logger logger = LoggerFactory.getLogger(LoginController.class);

Конфигурация в Weblogic:

  • pom.xml
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
  • ресурсы/log4j2.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<Configuration status = "debug" name = "TEST_WebLog">
    
    <ThresholdFilter level = "debug"/>
 
    <Appenders>
        <Console name = "Console">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{sessionId}] [%X{userId}] [%-5p] [Thread ID:%tid] [%c{1}:%L] - %msg%n"/>
        </Console>
        <RollingFile name = "ApplicationLog" fileName = "${sys:user.home}/A/B/logs/Applogs.log" filePattern = "${sys:user.home}/A/B/logs/Applogs.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{sessionId}] [%X{userId}] [%-5p] [Thread ID:%tid] [%c{1}:%L] - %msg%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size = "30 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "DatabaseLog" fileName = "${sys:user.home}/A/B/logs/Dblogs.log" filePattern = "${sys:user.home}/A/B/logs/Dblogs.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "XaiLog" fileName = "${sys:user.home}/A/B/logs/xai.log" filePattern = "${sys:user.home}/A/B/logs/xai.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "20 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "AbstractBaseDaoLog" fileName = "${sys:user.home}/A/B/logs/AbstractBaseDao.log" filePattern = "${sys:user.home}/A/B/logs/AbstractBaseDao.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "2000 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>              
    </Appenders>

    <Loggers>
        <Logger name = "org.hibernate" level = "debug" additivity = "false">
            <AppenderRef ref = "DatabaseLog" level = "debug"/>
            <AppenderRef ref = "Console" level = "info"/>
        </Logger>
        <Logger name = "com.A.common.dao.AbstractBaseDao" level = "debug" additivity = "false">
            <AppenderRef ref = "AbstractBaseDaoLog" level = "debug"/>
        </Logger>
        <Logger name = "com.A.xai" level = "debug" additivity = "false">
            <AppenderRef ref = "XaiLog" level = "debug"/>
        </Logger>
        <Logger name = "com.A" level = "debug" additivity = "false">
            <AppenderRef ref = "ApplicationLog" level = "debug"/>
            <AppenderRef ref = "Console" level = "info"/>
        </Logger>
        <Root level = "all">
            <AppenderRef ref = "ApplicationLog"/>
            <AppenderRef ref = "Console"/>
        </Root>
    </Loggers>
 
</Configuration>

Затем я удалил зависимость slf4j-log4j12 и добавил зависимость log4j-slf4j-impl, чтобы решить проблему смешивания log4j и log4j2 в Tomcat.

Конфигурация в Tomcat:

  • pom.xml
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>slf4j-log4j12</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--            <scope>compile</scope>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j.version}</version>
        </dependency>
  • resources/log4j2.xml (то же, что и log4j2.xml в Weblogic)
<?xml version = "1.0" encoding = "UTF-8"?>
<Configuration status = "debug" name = "TEST_WebLog">
    
    <ThresholdFilter level = "debug"/>
 
    <Appenders>
        <Console name = "Console">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{sessionId}] [%X{userId}] [%-5p] [Thread ID:%tid] [%c{1}:%L] - %msg%n"/>
        </Console>
        <RollingFile name = "ApplicationLog" fileName = "${sys:user.home}/A/B/logs/Applogs.log" filePattern = "${sys:user.home}/A/B/logs/Applogs.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{sessionId}] [%X{userId}] [%-5p] [Thread ID:%tid] [%c{1}:%L] - %msg%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size = "30 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "DatabaseLog" fileName = "${sys:user.home}/A/B/logs/Dblogs.log" filePattern = "${sys:user.home}/A/B/logs/Dblogs.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "XaiLog" fileName = "${sys:user.home}/A/B/logs/xai.log" filePattern = "${sys:user.home}/A/B/logs/xai.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "20 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>
        <RollingFile name = "AbstractBaseDaoLog" fileName = "${sys:user.home}/A/B/logs/AbstractBaseDao.log" filePattern = "${sys:user.home}/A/B/logs/AbstractBaseDao.log.%i">
            <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] - %msg%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size = "2000 MB"/>
            </Policies>
            <DefaultRolloverStrategy max = "10"/>
        </RollingFile>              
    </Appenders>

    <Loggers>
        <Logger name = "org.hibernate" level = "debug" additivity = "false">
            <AppenderRef ref = "DatabaseLog" level = "debug"/>
            <AppenderRef ref = "Console" level = "info"/>
        </Logger>
        <Logger name = "com.A.common.dao.AbstractBaseDao" level = "debug" additivity = "false">
            <AppenderRef ref = "AbstractBaseDaoLog" level = "debug"/>
        </Logger>
        <Logger name = "com.A.xai" level = "debug" additivity = "false">
            <AppenderRef ref = "XaiLog" level = "debug"/>
        </Logger>
        <Logger name = "com.A" level = "debug" additivity = "false">
            <AppenderRef ref = "ApplicationLog" level = "debug"/>
            <AppenderRef ref = "Console" level = "info"/>
        </Logger>
        <Root level = "all">
            <AppenderRef ref = "ApplicationLog"/>
            <AppenderRef ref = "Console"/>
        </Root>
    </Loggers>
 
</Configuration>

В настоящее время он нормально работает в Tomcat и нормально выводит необходимые журналы, включая журналы из org.apache.logging.log4j.LogManager и журналы из org.slf4j.LoggerFactory.

Но консоль выдала много бесполезных для меня логов (этого не происходит в WebLogic со смесью log4j и log4j2)

Часть бесполезного журнала в консоли:

2024-07-03 17:36:47.525 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 399 on disk
2024-07-03 17:36:47.525 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 832 on heap
2024-07-03 17:36:47.525 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -696 from heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 848 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 399 on disk
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 832 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -672 from heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 848 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 386 on disk
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 832 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -672 from heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 848 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 388 on disk
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 832 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -672 from heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 832 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 388 on disk
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 840 on heap
2024-07-03 17:36:47.526 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -704 from heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 404 on disk
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 848 on heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -720 from heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 856 on heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:72] [Segment:777] - fault added 411 on disk
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 864 on heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:72] [Segment:764] - fault removed -720 from heap
2024-07-03 17:36:47.535 [] [] [DEBUG] [Thread ID:78] [Segment:434] - put added 840 on heap

Ожидание: как я могу избежать этих больших объемов бесполезного вывода журналов при решении проблемы смешивания log4j и log4j2 в Tomcat, как я это сделал с WebLogic со смесью log4j и log4j2?

К вашему сведению: версия 2.11.1 содержит серьезные уязвимости, которые могут привести к удаленному выполнению кода. Обновитесь до последней версии (на данный момент 2.23.1). В том маловероятном случае, если вы застряли на Java 7 с версией EOL, вы можете использовать версию 2.12.4.

Piotr P. Karwasz 05.07.2024 07:05

@Piotr P. Karwasz Спасибо за ваше любезное напоминание. Я обновлю версию log4j.

chmod229 08.07.2024 07:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что ваш уровень журнала настроен на DEBUG. В Log4j 5 уровней логов, о них читайте здесь.

Попробуйте изменить его на уровень INFO, вы увидите меньше таких журналов.

Если быть точным, Log4j API имеет 6 стандартных уровней журналирования и вы можете создавать новые (см. документацию Log4j ). Spring использует общий знаменатель JUL, Logback и Log4j Core и предлагает только 5 уровней.

Piotr P. Karwasz 05.07.2024 07:31

Другие вопросы по теме