【已解决】使用SLF4J时的一个错误Failed to load class org.slf4j.impl.StaticLoggerBinder

2022-12-16 18:05:40 浏览数 (2)

使用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方法中直接运行,所以不属于测试环境,所以这个包相当于就没有加入依赖。后来修改为:

代码语言:javascript复制
<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

0 人点赞