如何强制使用 log4j 而不是 slf4j

How to force log4j to be used but not slf4j

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

在我的项目依赖中,我有slf4jlog4j。由于某些技术原因无法更改。

>gradlew dependencies
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could 
not be reused, use --status for details
> Task :dependencies
.
.
|    |         |    +--- org.springframework.boot:spring-boot-starter-logging:2.5.7
|    |         |    |    +--- ch.qos.logback:logback-classic:1.2.7
|    |         |    |    |    +--- ch.qos.logback:logback-core:1.2.7
|    |         |    |    |    \--- org.slf4j:slf4j-api:1.7.32
|    |         |    |    +--- org.apache.logging.log4j:log4j-to-slf4j:2.14.1
|    |         |    |    |    +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.32
|    |         |    |    |    \--- org.apache.logging.log4j:log4j-api:2.14.1 -> 2.17.0
|    |         |    |    \--- org.slf4j:jul-to-slf4j:1.7.32
|    |         |    |         \--- org.slf4j:slf4j-api:1.7.32
.
.
+--- org.apache.logging.log4j:log4j-core:2.17.0
|    \--- org.apache.logging.log4j:log4j-api:2.17.0
+--- org.apache.logging.log4j:log4j-api:2.17.0
BUILD SUCCESSFUL in 16s
1 actionable task: 1 executed

我想 set the log level in the code,而且据我所知,这只能用 log4j 完成。结果,我只是寻找一种方法来制作此代码行(LogManagerlog4j 的一部分) returns log4j 实现而不是 slf4j 实现:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
.
.
private final Logger logger = LogManager.getLogger(getClass());

遗憾的是,记录器的 class returns 是 org.apache.logging.slf4j.SLF4JLogger:

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

输出:

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

尽管听起来很容易,但我一直无法做到或在网上找到示例。可以做什么?

LogManager 的 class 完整路径是什么?它必须被导入,在那里你应该看到完整的 class.

我的猜测是您需要更改 Import 以导入一些 log4j LogManager,而不是 slf4j。

Log4j 2.x Core and the Log4j to SLF4J Adapter 是 Log4j 2.x API 的两个实现。如果它们都存在于类路径中,则使用 log4j-to-slf4j。这就是您的情况:使用 Log4j 2.x API 记录的消息被发送到 SLF4J,SLF4J 将它们发送到 Logback。

这是spring-boot-starter-logging. If you want to use Log4j 2 as backend instead you need to exclude that artifact and add spring-boot-starter-log4j2带来的标准日志记录配置。

无论如何,由于您使用的是Spring Boot,因此您有两种设置记录器级别的方法:

  1. 使用 Spring Boot 的 LoggingSystem 抽象(适用于所有可用的日志系统):

    final LoggingSystem loggingSystem = LoggingSystem.get(getClass().getClassLoader());
    loggingSystem.setLogLevel("loggerName", LogLevel.DEBUG);
    
    
  2. 使用底层日志系统。在你的情况下它是 Logback,所以你应该使用:

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

备注: 由于 Log4j 和 Logback 最近都存在漏洞,您应该将 Spring Boot 的版本升级到 2.5.8(或 2.6.2)。