使用SLF4J时的一个错误Failed to load class org.slf4j.impl.StaticLoggerBinder和log4j:WARN No appenders could be found for logger解决方案
一:使用SLF4J时的一个错误Failed to load class org.slf4j.impl.StaticLoggerBinder
问题描述
使用日志一直都是使用了slf4j-api、slf4j-log4j12、log4j这三个包结合起来使用,新搭建了一个项目,然后创建了一个main方法进行测试运行。然后发现报错了。
代码语言:javascript复制Failed to load class org.slf4j.impl.StaticLoggerBinder
解决过程
去SLF4J的官网查询这个错误的原因是什么,得到的结论是:
代码语言:javascript复制无法加载类 org.slf4j.impl.StaticLoggerBinder
当无法将类org.slf4j.impl.StaticLoggerBinder加载到内存中时,会报告此警告消息 。如果在类路径上找不到合适的SLF4J绑定,就会发生这种情况。在类路径中放置slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的一个(并且只有一个)应该可以解决问题。
自1.6.0起SLF4J版本1.6 以来,在没有绑定的情况下,SLF4J将默认为无操作(NOP)记录器实现。
如果您负责打包应用程序并且不关心日志记录,那么将slf4j-nop.jar放在应用程序的类路径中将摆脱此警告消息。请注意,嵌入式组件(如库或框架)不应声明对任何SLF4J绑定的依赖关系,但仅依赖于slf4j-api。当库声明对SLF4J绑定的编译时依赖性时,它会将该绑定强加给最终用户,从而否定SLF4J的目的。
总的来说,就是缺少slf4j-log4j12.jar
这个依赖,但是我的是Maven项目,我很确定我已经加入了这个包,但是为什么还是会出错呢。
后来才发现了问题的所在,我的依赖如下所示:
代码语言:javascript复制<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.log4j.version}</version>
<scope>test</scope>
</dependency>
因为我把范围设置为test,也就是说只有在测试环境下,才可以使用,而我是在main
方法中直接运行,所以不属于测试环境,所以这个包相当于就没有加入依赖。后来修改为:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.log4j.version}</version>
<scope>compile</scope>
</dependency>
二:log4j:WARN No appenders could be found for logger解决方案
问题原因
- 缺失log4j.properties或log4j.xml配置文件;
- log4j.properties配置文件为放在source文件夹下;
- log4j.properties配置文件编码不正确;
解决方案
- 确认是否建立log4j.properties或log4j.xml配置文件;
- 确认配置文件是否名称为log4j.properties或log4j.xml;
- 确认配置文件编码是否为UTF-8
- 确认配置文件中的内容是否正确。
log4j.properties具体配置
1、在src/main/resources路径新建log4j.properties
2、添加如下内容
代码语言:javascript复制#############
# log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR < FATAL
# WARN:日志级别 CONSOLE:输出位置自己定义的一个名字 logfile:输出位置自己定义的一个名字
log4j.rootLogger=INFO,CONSOLE,logfile
# 配置CONSOLE输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 配置CONSOLE设置为自定义布局模式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 配置CONSOLE日志的输出格式 2019-08-22 22:52:12,000 %r耗费毫秒数 %p日志的优先级 %t线程名 %C所属类名通常为全类名 %L代码中的行号 %x线程相关联的NDC %m日志 %n换行
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
################
# 输出到日志文件中
################
# 配置logfile输出到文件中 文件大小到达指定尺寸的时候产生新的日志文件
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
# 保存编码格式
log4j.appender.logfile.Encoding=UTF-8
# 输出文件位置此为项目根目录下的logs文件夹中
log4j.appender.logfile.File=C:\Users\durant.zeng\Desktop\2.8.0\logs\mylo.log
# 后缀可以是KB,MB,GB达到该大小后创建新的日志文件
log4j.appender.logfile.MaxFileSize=10MB
# 设置滚定文件的最大值3 指可以产生root.log.1、root.log.2、root.log.3和root.log四个日志文件
log4j.appender.logfile.MaxBackupIndex=3
# 配置logfile为自定义布局模式
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
##########################
# 对不同的类输出不同的日志文件
##########################
# club.bagedate包下的日志单独输出
log4j.logger.club.bagedate=DEBUG,bagedate
# 设置为false该日志信息就不会加入到rootLogger中了
log4j.additivity.club.bagedate=false
# 下面就和上面配置一样了
log4j.appender.bagedate=org.apache.log4j.RollingFileAppender
log4j.appender.bagedate.Encoding=UTF-8
log4j.appender.bagedate.File=C:\Users\durant.zeng\Desktop\2.8.0\logs\mylo.log
log4j.appender.bagedate.MaxFileSize=10MB
log4j.appender.bagedate.MaxBackupIndex=3
log4j.appender.bagedate.layout=org.apache.log4j.PatternLayout
log4j.appender.bagedate.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n