如何强制使用log4j而不使用slf4j

jdg4fx2g  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(244)

**编辑:**为了澄清问题,我添加了许多解释。

在我的项目依赖项中,我同时有slf4jlog4j。由于某些技术原因,这不能更改。

  1. >gradlew dependencies
  2. Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could
  3. not be reused, use --status for details
  4. > Task :dependencies
  5. .
  6. .
  7. | | | +--- org.springframework.boot:spring-boot-starter-logging:2.5.7
  8. | | | | +--- ch.qos.logback:logback-classic:1.2.7
  9. | | | | | +--- ch.qos.logback:logback-core:1.2.7
  10. | | | | | \--- org.slf4j:slf4j-api:1.7.32
  11. | | | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.14.1
  12. | | | | | +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.32
  13. | | | | | \--- org.apache.logging.log4j:log4j-api:2.14.1 -> 2.17.0
  14. | | | | \--- org.slf4j:jul-to-slf4j:1.7.32
  15. | | | | \--- org.slf4j:slf4j-api:1.7.32
  16. .
  17. .
  18. +--- org.apache.logging.log4j:log4j-core:2.17.0
  19. | \--- org.apache.logging.log4j:log4j-api:2.17.0
  20. +--- org.apache.logging.log4j:log4j-api:2.17.0
  21. BUILD SUCCESSFUL in 16s
  22. 1 actionable task: 1 executed

我想在代码中设置日志级别,而AFAIK只能用log4j来完成.因此,我简单地寻找一种方法,使这行代码(LogManagerlog4j的一部分)返回log4j实现而不是slf4j实现:

  1. import org.apache.logging.log4j.LogManager;
  2. import org.apache.logging.log4j.Logger;
  3. .
  4. .
  5. private final Logger logger = LogManager.getLogger(getClass());

遗憾的是,记录器的类返回的是org.apache.logging.slf4j.SLF4JLogger

  1. System.out.println("logger class is: [" + logger.getClass() + "]");

输出:

  1. logger class is: [class org.apache.logging.slf4j.SLF4JLogger]

虽然听起来很简单,但我一直没能做到,也没能在网上找到一个例子。

atmip9wb

atmip9wb1#

Log4j 2.x CoreLog4j to SLF4J Adapter是Log4j 2.x API的两个实现。如果它们都出现在类路径中,则使用log4j-to-slf4j。这就是在您的示例中发生的情况:使用Log4j 2.x API记录的消息将发送到SLF4J,SLF4J再将这些消息发送到Logback。
这是spring-boot-starter-logging带来的标准日志配置。如果您想使用Log4j 2作为后端,则需要排除该工件并添加spring-boot-starter-log4j2
无论如何,由于您使用的是Sping Boot ,因此有两种方法可以设置记录器的级别:
1.使用Sping Boot 的LoggingSystem抽象(适用于所有可用的日志记录系统):

  1. final LoggingSystem loggingSystem = LoggingSystem.get(getClass().getClassLoader());
  2. loggingSystem.setLogLevel("loggerName", LogLevel.DEBUG);

1.使用基础事件记录系统。在您的情况下,它是回滚,因此您应该用途:

  1. final Logger logger = LoggerFactory.getLogger("loggerName");
  2. if (logger instanceof ch.qos.logback.classic.Logger) {
  3. ((ch.qos.logback.classic.Logger) logger).setLevel(Level.DEBUG);
  4. }

**备注:**由于Log4j和Logback中的最新漏洞,您应该将您的Sping Boot 版本升级到2.5.8(或2.6.2)。

展开查看全部
lf3rwulv

lf3rwulv2#

LogManager的完整类路径是什么?它必须被导入,在那里你应该看到完整的类。
我的猜测是,您需要更改Import以导入一些log4j LogManager,而不是slf4j。

相关问题