SLF4J常见问题
- 1、SLF4J简介
- 2、SLF4J实现原理
- 3、SLF4J常见问题
1、SLF4J简介
SLF4J(Simple Logging Facade for Java)是一个为Java程序提供日志输出的统一接口,并不具备具体的日志实现方案,类似JDBC,SLF4J只做两件事:提供日志接口、提供获取具体日志对象的方法
SLF4J只是一个日志标准,并不是日志系统的具体实现。SLF4J允许我们选择合适的日志框架(如Log4j、Logback等)实现日志输出功能
SLF4J-Simple、Logback等都是SLF4J的具体实现,Log4j并不直接实现SLF4J,而是由一层专门的桥接SLF4J-Log4j12来实现
2、SLF4J实现原理
导入依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.15</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
基本使用:
package com.cc;
import org.apache.log4j.Logger;
public class Test01 {
private static final Logger logger = Logger.getLogger(Test01.class);
public static void main(String[] args) {
logger.info("This is a test.");
}
}
SLF4J的具体实现是通过LoggerFactory的getLogger()
方法获取的。该方法会通过org/slf4j/impl/StaticLoggerBinder.class
获取所有SLF4J的实现。在具体的日志实现jar
包路径下,一定是有org/slf4j/impl/StaticLoggerBinder.class
的存在
如果我们同时引入了多个SLF4J的实现,编译器会选择其中一个StaticLoggerBinder进行绑定,此时Console会显示警告
3、SLF4J常见问题
3.1、StaticLoggerBinder问题
在实际使用中,通常会遇到org.slf4j.impl.StaticLoggerBinder
相关的错误,该错误意味着SLF4J无法找到其需要的绑定来执行日志操作,这通常是由于缺少相应的日志实现或类路径配置不正确导致的
SLF4J在启动时会尝试加载一个名为org.slf4j.impl.StaticLoggerBinder
的类,这是SLF4J与具体日志实现之间交互的关键,如果找不到这个类,就会抛出如下错误:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
根据官网描述:
只需要将slf4j-nop.jar
、slf4j-simple.jar
、slf4j-log4j12.jar
、slf4j-jdk14.jar
或logback-classic.jar
中的一个(且只能一个)添加到类路径即可
例如,对于Log4j,添加如下依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
3.2、日志配置问题
添加日志实现后,还需要根据日志实现的特性进行日志配置。例如,对于Log4j,需要创建log4j.properties
或log4j.xml
配置文件并编辑必要属性,否则可能报错:
在resources
下新建log4j.properties
日志配置文件:
### 配置根 ###
# 控制将指定级别(INFO)的日志输出到哪些目的地(CONSOLE,fileAppender,dailyRollingFile,ROLLING_FILE)
#log4j.rootLogger=INFO,CONSOLE,fileAppender,dailyRollingFile,ROLLING_FILE
log4j.rootCategory=INFO,console
### 配置输出到控制台 ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-d{yyyy/MM/dd HH:mm:ss} [%-5p] %c{1}:%L: %m%n
### 配置输出到文件 ###
# 输出DEBUG级别以上的日志到logs/error.log
log4j.appender.fileAppender=org.apache.log4j.FileAppender
log4j.appender.fileAppender.File=logs/error.log
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.Threshold=DEBUG
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,并且每天都创建一个文件 ###
# 输出DEBUG级别以上的日志到logs/error.log
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File=logs/error.log
log4j.appender.dailyRollingFile.Append=true
log4j.appender.dailyRollingFile.Threshold=DEBUG
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,且到达指定大小的时候产生一个新的文件 ###
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
综上所述,解决SLF4J相关问题通常包括以下几个步骤:
-
检查依赖冲突:确保项目中没有多个SLF4J的实现库,例如同时包含Log4j和Logback,这种情况下,需要清理并排除冲突依赖
-
添加日志实现:如果项目中只包含SLF4J的API,而没有具体的日志实现,则需要添加一个,例如Log4j或Logback
-
配置日志实现:添加日志实现后,还需要根据日志实现的特性进行日志配置。例如对于Log4j,则需要配置
log4j.properties
或log4j.xml
通过上述步骤,我们便能确保日志功能正常工作
参考文章:
https://cloud.tencent.com/developer/article/2160396
https://www.modb.pro/db/130472