Spring集成SLF4J Logger启动报错:缺少org.slf4j.Logger类型Bean
Spring集成SLF4J启动失败问题排查
问题复现
项目中使用SLF4J输出日志,相关代码片段如下:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger = LoggerFactory.getLogger(MyService.class); logger.info("");
应用启动时直接抛出异常,进程以退出码1终止,控制台核心报错信息:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-06-13 14:38:42.998 ERROR 12884 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : --- APPLICATION FAILED TO START ---
报错详情:
com.myapp.app.service.MyService类构造器的第2个参数需要类型为
org.slf4j.Logger的Bean,但Spring容器中无法找到该Bean。
修复建议:请考虑在你的配置中定义org.slf4j.Logger类型的Bean。
根因
SLF4J的Logger实例不需要交给Spring容器管理,也不应该通过构造器注入、@Autowired注解注入的方式获取。出现这个报错是因为你将Logger放在了MyService的构造器参数列表中,Spring启动时尝试从容器找对应类型的Bean完成注入,但容器内不存在该类型的Bean,直接触发启动失败。
注意:Spring给出的“定义Logger类型Bean”的默认修复建议不适用于该场景,不需要手动注册Logger类型的Bean。
修复方法
- 移除构造器参数里的
Logger类型声明,不要给Logger成员变量加任何Spring注入注解 - 直接在类内部通过
LoggerFactory.getLogger()方法静态初始化Logger实例作为类成员使用,正确写法参考:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @Service public class MyService { // 直接初始化日志实例,不需要Spring注入 private static final Logger logger = LoggerFactory.getLogger(MyService.class); public void bizMethod() { logger.info("业务日志正常输出"); } }
- 如果不想每个类都手动写Logger初始化代码,可以引入Lombok依赖,在类上添加
@Slf4j注解,编译期会自动生成上述日志实例代码,不会触发Spring注入报错。
内容的提问来源于stack exchange,提问作者Krishna Prasad
相关产品推荐
相关产品推荐

