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

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

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

在我的项目依赖项中,我同时有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

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

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

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

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

输出:

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抽象(适用于所有可用的日志记录系统):

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

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

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中的最新漏洞,您应该将您的Sping Boot 版本升级到2.5.8(或2.6.2)。

lf3rwulv

lf3rwulv2#

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

相关问题