SpringBoot项目logback不能打印日志问题解决

1、报错信息

Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.<init>(LogbackLoggingSystem.java:113)
    at org.springframework.boot.logging.logback.LogbackLoggingSystem$Factory.getLoggingSystem(LogbackLoggingSystem.java:495)
    at org.springframework.boot.logging.DelegatingLoggingSystemFactory.getLoggingSystem(DelegatingLoggingSystemFactory.java:44)
    at org.springframework.boot.logging.LoggingSystem.get(LoggingSystem.java:167)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:237)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:220)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138)
    at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136)
    at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:75)
    at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:54)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)
    at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
    at com.moo.jsonmss.JsonMssApplication.main(JsonMssApplication.java:14)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.util.StatusPrinter2
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
    ... 20 more

2、分析

JDK21,pom.xml配置如下:

 <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.9</version>
        </dependency>

<!--         Logback 实现(Spring Boot 默认自带,通常不需要额外添加)-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.11</version>
            <exclusions>
                <exclusion>
                    <artifactId>logback-core</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
<!--         Logback Core-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.4.11</version> <!-- 使用合适版本 -->
        </dependency>

 logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

检查配置无问题,排查包冲突,排除了logback-classic中的logback-core依赖,仍未解决;

继续查看jar包冲突,发现除了1.4.11版本的logback-classic,还存在1.51.8版本的,继续追查,原来,spring-boot-starter-logging中依赖logback-classic,版本是1.5.18;

最终解决:去除pom文件中,上述所有直接引入,包括slf4j-api、logback-classic、logback-core,完全依赖spring-boot-starter-logging中依赖的所有日志版本,完美解决;问题根源

3、问题根源

当项目中主动引入日志依赖时,一般根源还是jar包冲突;当前这个问题时,自行引入的和spring-boot-starter-logging依赖的日志版本不一致,导致报错;spring-boot-starter-logging下面已经提供所有slf具体日志实现,并确保版本一致,所以,不在需要自行引入;

4、推荐

idea排查解决jar包冲突,建议引入maven helper插件,如上述截图,非常便捷好用。

<think> 首先,用户的问题是:“我想查找在Spring BootLogback环境下,MyBatis Plus SQL语句不打印解决方案 请问Spring Boot + Logback环境下MyBatis Plus SQL语句不打印解决办法”。 用户提供了站内引用: - 引用[1]: 关于MyBatis-Plus的自定义SQL操作。 - 引用[2]: 关于Spring Boot + MyBatis-Plus的SQL日志配置到文件。 - 引用[3]: 关于Spring BootLogback配合MyBatis输出SQL。 用户指定“上述引用仅供参考,并不是用户真正的需求”,所以我需要专注于用户的问题解决MyBatis Plus SQL语句不打印问题。 关键点是:Spring Boot + Logback环境下,MyBatis Plus的SQL语句没有打印出来。 从系统级指令: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 保证回答真实可靠。 - 行内数学表达式用$...$,但我这里没有数学内容,所以可能不需要。 - 独立公式用$$...$$,但同样,这个问题不涉及数学。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户提到“尽可能多的参考用户上一次的问题和你的回答”,但在这个对话中,这是第一条消息,所以没有上一次问题。我需要基于当前上下文回答。 分析问题原因: - 在Spring Boot中使用MyBatis Plus和Logback时,SQL语句不打印可能是日志级别配置不正确。 - Logback日志框架,默认情况下,MyBatis(或MyBatis Plus)的SQL日志可能不被打印,因为没有启用调试级别。 从引用[2]和[3]中,我可以看出: - 引用[2]提到配置Logback将SQL日志输出到文件,通过设置控制台日志级别为DEBUG。 - 引用[3]是关于Logback依赖。 常见的解决方案步骤: 1. 确保日志级别设置为DEBUG或更低(如TRACE)来捕获SQL语句。 - MyBatis Plus的SQL日志通常在`org.apache.ibatis`或特定mapper包下。 2. 检查Logback配置文件(如logback-spring.xml)。 3. 确保依赖正确,没有冲突。 具体步骤: - 在application.properties或application.yml中设置日志级别。 - 例如:`logging.level.org.apache.ibatis=DEBUG` - 或针对mapper:`logging.level.com.example.mapper=DEBUG` - 在Logback配置文件中,设置相关logger的级别。 从引用[2],它展示了如何在Logback配置中设置控制台输出级别为DEBUG。 引用[2]中的片段: ```xml <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <charset>UTF-8</charset> </encoder> </appender> ``` 这设置了控制台日志级别为DEBUG,但更精确的方法是针对特定logger设置级别。 完整解决方案: 1. **检查日志级别配置**: - 在application.properties中添加: ``` logging.level.root=INFO logging.level.org.springframework=INFO logging.level.org.apache.ibatis=DEBUG logging.level.com.baomidou.mybatisplus=DEBUG ``` 或针对你的mapper包路径设置。 2. **更新Logback配置文件**: - 创建一个logback-spring.xml文件(如果不存在),并添加: ```xml <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <logger name="org.apache.ibatis" level="DEBUG"/> <logger name="com.baomidou.mybatisplus" level="DEBUG"/> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration> ``` 3. **确保依赖正确**: - Spring Boot启动器包括logging,如引用[3]提到的`spring-boot-starter-logging`。 - 检查pom.xml或build.gradle中是否有正确的依赖。 4. **测试**: - 运行应用并检查日志输出。 最后,生成相关问题。 回答结构: - 逐步解释解决方案。 - 使用代码块展示配置。 - 在引用引用时添加标识,如[^2]。 - 结尾添加相关问题。 确保引用正确: - 参考引用[2]和[3],因为它们直接相关。 - 引用[1]是关于自定义SQL的,不直接相关,但用户说参考,所以或许提及但不重点。 最终回答大纲: 1. 引言:解释问题原因(日志级别不足)。 2. 步骤1:在application.properties中设置日志级别。 3. 步骤2:配置Logback文件。 4. 步骤3:验证依赖。 5. 测试和验证。 6. 相关问题。 </think> ### Spring Boot + Logback环境下MyBatis Plus SQL语句不打印解决方案 在Spring Boot项目中整合MyBatis Plus时,SQL语句不打印可能是日志级别配置不当导致的。Logback作为默认日志框架,需要明确设置MyBatis相关组件的日志级别为`DEBUG`或`TRACE`才能输出SQL语句。以下是逐步解决方案,基于最佳实践和引用内容: #### 步骤1: 检查并设置日志级别(推荐优先方案) 在`application.properties`或`application.yml`文件中添加以下配置,直接设置特定包的日志级别: ```properties # 设置MyBatis核心包和MyBatis Plus包的日志级别为DEBUG logging.level.org.apache.ibatis=DEBUG logging.level.com.baomidou.mybatisplus=DEBUG # 如果SQL仍未打印,尝试将级别设为TRACE(更详细) logging.level.org.apache.ibatis.jdbc.SqlRunner=TRACE # 确保Spring默认日志级别不覆盖(可选) logging.level.root=INFO ``` - **原理**:MyBatis Plus的SQL日志由`org.apache.ibatis`包处理,设置为`DEBUG`会打印SQL语句;`TRACE`会额外显示参数绑定细节。 - **验证**:重启应用后,控制台应输出类似`==> Preparing: SELECT * FROM user WHERE id = ?`的日志。 #### 步骤2: 配置Logback文件(适用于高级定制) 如果步骤1无效,或需要将SQL日志输出到文件,需编辑Logback配置文件(`logback-spring.xml`)。创建或修改该文件,添加以下内容: ```xml <configuration> <!-- 包含Spring Boot默认配置 --> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <!-- 设置控制台输出级别为DEBUG --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> <!-- 确保捕获DEBUG信息 --> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 针对MyBatis和MyBatis Plus包设置专用Logger --> <logger name="org.apache.ibatis" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE"/> </logger> <logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE"/> </logger> <!-- 根Logger保持INFO级别 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration> ``` - **关键点**: - `additivity="false"` 防止日志被父Logger覆盖。 - `<level>DEBUG</level>` 确保输出SQL语句(参考引用[2]中对控制台日志级别的设置)[^2]。 - **文件位置**:将`logback-spring.xml`放在`src/main/resources`目录下。 #### 步骤3: 检查依赖和冲突 1. **确认Logback依赖**: 确保`pom.xml`中有Spring Boot日志启动器(Spring Boot 2.x+默认包含): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <!-- 自动引入Logback --> </dependency> ``` 如果手动排除了默认日志(如使用了`spring-boot-starter-web`),需显式添加此依赖(参考引用[3])[^3]。 2. **排除日志冲突**: 检查是否有其他日志框架(如Log4j)冲突。在`pom.xml`中排除冲突依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <!-- 若存在 --> </exclusion> </exclusions> </dependency> ``` #### 步骤4: 验证和测试 - **测试方法**:执行一个简单查询(如`userMapper.selectById(1)`)。 - **预期输出**: 控制台或日志文件应显示: ``` DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger - ==> Preparing: SELECT * FROM user WHERE id=? DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger - ==> Parameters: 1(Integer) ``` - **常见失败原因**: - 日志级别被全局设置为`INFO`或更高(如`logging.level.root=INFO`覆盖了具体设置)。 - 配置文件未生效(检查文件名是否为`logback-spring.xml`,位置是否正确)。 - 依赖冲突(使用`mvn dependency:tree`检查)。 #### 引用说明 本解决方案综合了日志级别配置和Logback定制方法,参考了如何通过设置DEBUG级别捕获SQL日志的实践[^2],以及Logback依赖的必要性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值