**编辑:**为了澄清问题,我添加了许多解释。
在我的项目依赖项中,我同时有slf4j
和log4j
。由于某些技术原因,这不能更改。
>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
来完成.因此,我简单地寻找一种方法,使这行代码(LogManager
是log4j
的一部分)返回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]
虽然听起来很简单,但我一直没能做到,也没能在网上找到一个例子。
2条答案
按热度按时间atmip9wb1#
Log4j 2.x Core和Log4j 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.使用基础事件记录系统。在您的情况下,它是回滚,因此您应该用途:
**备注:**由于Log4j和Logback中的最新漏洞,您应该将您的Sping Boot 版本升级到2.5.8(或2.6.2)。
lf3rwulv2#
LogManager的完整类路径是什么?它必须被导入,在那里你应该看到完整的类。
我的猜测是,您需要更改Import以导入一些log4j LogManager,而不是slf4j。