Я перемещаю проект из 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);
<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>
<?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.
<!-- <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>
<?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?
@Piotr P. Karwasz Спасибо за ваше любезное напоминание. Я обновлю версию log4j.
Это связано с тем, что ваш уровень журнала настроен на DEBUG. В Log4j 5 уровней логов, о них читайте здесь.
Попробуйте изменить его на уровень INFO, вы увидите меньше таких журналов.
Если быть точным, Log4j API имеет 6 стандартных уровней журналирования и вы можете создавать новые (см. документацию Log4j ). Spring использует общий знаменатель JUL, Logback и Log4j Core и предлагает только 5 уровней.
К вашему сведению: версия
2.11.1
содержит серьезные уязвимости, которые могут привести к удаленному выполнению кода. Обновитесь до последней версии (на данный момент2.23.1
). В том маловероятном случае, если вы застряли на Java 7 с версией EOL, вы можете использовать версию2.12.4
.