【Bug】使用Log4j可以打印日志,使用Slf4j无法打印日志

刚学习了点Tomcat的知识,于是想在服务中监测下Tomcat的启动时间,优化一下试试,于是写了如下的代码:

java 复制代码
@Component
@Slf4j
public class StartupTimeListener implements ApplicationListener<ApplicationStartedEvent> {

    private final long startTime;

    public StartupTimeListener() {
        startTime = System.currentTimeMillis();
    }

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        System.out.println("Tomcat启动消耗" + (endTime - startTime) + "毫秒");
        log.info("Tomcat启动耗时" + duration + "毫秒");
    }

}

非常正常的代码,一个事件监听器,记录下开始时间和结束时间,最后打印出耗时,出现的问题是控制台完全没有日志信息,但是sout的输出被正常打印

这个时候我也没多想,把Slf4j换成了Log4j,结果日志正常打印了

这时候我不明白的一个点是,大家都是 info 级别的打印,如果限制了日志级别,凭什么 Log4j 可以而 Slf4j 就不行,后来发现这个问题我出现的太巧合了

Log4j 使用的时候是需要有配置文件初始化的,一般叫 log4j.properties ,没有这个配置文件的话根本不会打印任何数据,但这跟我的情况不一样,我是可以打印,所以我就去找这个配置文件。

发现由于业务有加密的需要,因此引入了自定义的区块链依赖,其中包括了 log4j 依赖和 dzsjfcgpt-encode 依赖,后面的这个依赖里有关于 log4j 的配置文件,其中定义了 log4j 输出日志的最低级别为 DEBUG ,因此可以正常打印出 Info 级别的日志,那为什么 Slf4j 的日志没有被打印出来呢?

application.yaml中有这样的一个配置项:

yaml 复制代码
logging:
  level:
    root: warn

这个配置项设置了 Slf4j 打印日志的最低等级,为了减少生产环境的日志信息,一般至少配置到 warn 级别,本地测试时没有修改导致日志没有输出到控制台。

总结问题出现的原因:

  • 某个依赖中引入了 log4j 的配置文件,且配置文件的日志级别比使用的要低
  • 配置文件中定义了 slf4j 的日志级别
相关推荐
炽天使32818 小时前
Knife4j 4.5.0 + Spring Boot 3.4.11 版本兼容问题解决方案
1024程序员节
测试修炼手册3 天前
[测试技术] TestNG 入门与实战:分组、数据驱动与并行执行
junit·单元测试·log4j
在水一缸4 天前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
liguojun20254 天前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
风向决定发型d7827 天前
Github Copilot 实战应用与效能提升指南
log4j·github·copilot
AI大模型-小雄11 天前
充值Codex + GPT-5.5 并发 Bug 调试实战:从时序分析到回归测试
gpt·log4j·bug
JustNow_Man12 天前
【OpenSpec】/opsx:archive 的作用是什么解析
log4j
星释13 天前
鸿蒙智能体开发实战:27.Skill 测试、发布与管理
ui·华为·log4j·harmonyos·鸿蒙·智能体
充钱大佬13 天前
Python测试基础教程
python·log4j·apache
liguojun202513 天前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节