如何强制使用 log4j 而不是 slf4j
How to force log4j to be used but not slf4j
编辑:为了澄清问题,我添加了很多解释。
在我的项目依赖中,我有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
我想 set the log level in the code,而且据我所知,这只能用 log4j
完成。结果,我只是寻找一种方法来制作此代码行(LogManager
是 log4j
的一部分) 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,因此您有两种设置记录器级别的方法:
使用 Spring Boot 的 LoggingSystem
抽象(适用于所有可用的日志系统):
final LoggingSystem loggingSystem = LoggingSystem.get(getClass().getClassLoader());
loggingSystem.setLogLevel("loggerName", LogLevel.DEBUG);
使用底层日志系统。在你的情况下它是 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)。
编辑:为了澄清问题,我添加了很多解释。
在我的项目依赖中,我有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
我想 set the log level in the code,而且据我所知,这只能用 log4j
完成。结果,我只是寻找一种方法来制作此代码行(LogManager
是 log4j
的一部分) 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,因此您有两种设置记录器级别的方法:
使用 Spring Boot 的
LoggingSystem
抽象(适用于所有可用的日志系统):final LoggingSystem loggingSystem = LoggingSystem.get(getClass().getClassLoader()); loggingSystem.setLogLevel("loggerName", LogLevel.DEBUG);
使用底层日志系统。在你的情况下它是 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)。