Springboot+logback 自定义日志打印(根据关键字动态生成不同日志文件,打印IP)

本文介绍了一种基于关键字的日志管理方案,通过自定义配置和动态创建appender,实现了日志的精细化管理和采集,适用于不同业务场景下的日志分析。
描述:根据业务需要现需根据不同关键字将日志打印到不同的文件中,便于日志采集。
	 日志中需要体现出应用名称、IP等信息

  1. 自定义配置,获取节点ip
    在logback-spring.xml中通过<conversionRule conversionWord="ip" converterClass="com.apigateway.config.IpLogConfig"/>可以获取当前节点ip地址
package com.apigateway.config;

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.apigateway.enums.LogLevelEnum;
import com.apigateway.util.LogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @Author:xingpf
 * @Date: 2020/4/22  9:18
 * @Descriptions: logback 打印ip地址配置类
 */
public class IpLogConfig extends ClassicConverter {
    private static final Logger log = LoggerFactory.getLogger(IpLogConfig.class);
    private static String localIp = null;

    @Override
    public String convert(ILoggingEvent event) {
        try {
            if (StringUtil.isBlank(localIp)) {
                localIp = InetAddress.getLocalHost().getHostAddress();
            }
            return localIp;
        } catch (UnknownHostException e) {
            log.error("获取ip地址异常,exception={}", e.toString());
            LogUtil.logInfo("[IpLogConfig][convert] 获取ip地址异常,exception={}", 
            e.toString(), LogLevelEnum.EVENT.getLevel());
        }
        return null;
    }
}

  1. application.yml配置
spring:
  profiles:
    active: ${RUN_ENV:dev}
  application:
    name: apigateway
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true

server:
  port: 5106
  servlet:
    context-path: /apigateway
  tomcat:
    uri-encoding: UTF-8
  
sentinel:
  degradeRule:
    ex-count: ${ex-count:5}
    time-window: ${time-window:10}
#0:关闭,1:打开
logToMqSwitch: ${mq-flag:1}

#日志保存路径
log:
  #日志保存路径
  path: /logs/apigateway
  #日志字符集
  charset: UTF-8
  #最大历史天数
  max-history: 30
  #单个日志文件最大体积
  max-file-size: 10MB
  #全部日志文件最大体积
  total-size-cap: 2GB
  #日志格式
  pattern: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n'
  1. logback-spring.xml配置,
  • 该配置文件中可以用过<springProperty scope="context" name="logPath" source="log.path"/>该标签读取application.yml配置文件中的配置信息变量;
  • 通过自定义appender及logger可以在代码中通过定义 的logger获取自定义的logger对象,将某些需要收集的日志信息单独打印到指定文件中
<!--自定义appender打印采集日志-->
<appender name="COLLECT_LOG_INFO"  class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--打印日志用于日志采集-->
    <logger name="COLLECT_LOG_INFO_FILE">
        <appender-ref ref="COLLECT_LOG_INFO"/>
    </logger>
 	/**
     * 获取采集日志专用logger对象
     */
    private static final Logger logger = LoggerFactory.getLogger("COLLECT_LOG_INFO_FILE");

完整logback-spring.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">

    <contextName>apigateway</contextName>
    <springProperty scope="context" name="logPath"
                    source="log.path"/>
    <springProperty scope="context" name="logCharset"
                    source="log.charset"/>
    <springProperty scope="context" name="logMaxHistory"
                    source="log.max-history"/>
    <springProperty scope="context" name="logMaxFileSize"
                    source="log.max-file-size"/>
    <springProperty scope="context" name="logTotalSizeCap"
                    source="log.total-size-cap"/>
    <springProperty scope="context" name="logPattern"
                    source="log.pattern"/>

    <!--配置规则类位置,获取节点ip-->
    <conversionRule conversionWord="ip" converterClass="com.apigateway.config.IpLogConfig"/>
    <conversionRule conversionWord="apigateway" converterClass="ch.qos.logback.classic.pattern.LoggerConverter"/>
    <property name="collectLogPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}#|###|#%ip#|###|#%contextName#|###|#%msg%n"/>



    <!--打印采集日志-->
    <appender name="COLLECT_LOG_INFO"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 活动日志文件路径-->
		<file>${logPath}/log_collect.log</file>
        <encoder>
            <pattern>${collectLogPattern}</pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 归档日志文件路径-->
            <fileNamePattern>${logPath}/collect/log-collect-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <!-- 单个日志文件最大大小-->
                <maxFileSize>${logMaxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
             <!-- 最大保留天数-->
            <maxHistory>${logMaxHistory}</maxHistory>
             <!-- 所有日志文件最大容量-->
            <totalSizeCap>${logTotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <appender name="CONSOLE"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>${logPattern}</Pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <appender name="DEBUG_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/log_debug.log</file>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${logMaxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${logMaxHistory}</maxHistory>
            <totalSizeCap>${logTotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="INFO_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/log_info.log</file>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/info/log-info-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${logMaxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${logMaxHistory}</maxHistory>
            <totalSizeCap>${logTotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <appender name="WARN_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/log_warn.log</file>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${logMaxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${logMaxHistory}</maxHistory>
            <totalSizeCap>${logTotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <appender name="ERROR_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/log_error.log</file>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>${logCharset}</charset>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/error/log-error-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${logMaxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${logMaxHistory}</maxHistory>
            <totalSizeCap>${logTotalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--打印日志用于日志采集-->
    <logger name="COLLECT_LOG_INFO_FILE">
        <appender-ref ref="COLLECT_LOG_INFO"/>
    </logger>

    <springProfile name="dev">
        <root level="debug">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="WARN_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </root>
    </springProfile>
    <springProfile name="pro,test">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="WARN_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </root>
    </springProfile>

    <logger name="org.springframework.scheduling">
        <level value="info"/>
    </logger>

</configuration>
  1. 日志配置文件中的配置信息一经打包将不再改变,如何实现根据不同关键字将对应的相关日志信息打到不同的日志文件中呢?关键字已知的情况下可以通过在logback-spring.xml中自定义appender实现,但如果关键字非常多或关键字未知时如何实现呢?这时候就需要通过代码实现动态创建appender了:
package com.apigateway.config;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;
import ch.qos.logback.core.util.OptionHelper;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * @Author:xingpf
 * @Date: 2020/4/30  14:22
 * @Descriptions:动态生成logback.xml配置文件的appender
 */
public class LogAppenderConfig {

	/**
	 *  日志打印根目录
	 */
    private static final String LOG_BASE_PATH = "/logs/";

    /**
     * 本地静态ConcurrentHashMap存储已有的日志文件名,线程安全
     */
    private static Map<String, Logger> logFileNameMap = new ConcurrentHashMap<>();


    /**
     * 根据logFileName获取logger对象
     *
     * @param logFileName
     * @return
     */
    public static Logger getLogger(String logFileName) {
        Logger logger = logFileNameMap.get(logFileName);
        if (logger != null) {
            return logger;
        }
        logger = createLogger(logFileName);
        logFileNameMap.put(logFileName, logger);
        return logger;
    }


    /**
     * 根据传入logFileName创建当前Logger对象输出日志的文件名
     *
     * @param logFileName 要创建的日志文件名称
     * @return
     */
    private static Logger createLogger(String logFileName) {

        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        //创建logger对象
        Logger logger = loggerContext.getLogger(logFileName);
        logger.setAdditive(false);

        //创建appender,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
        RollingFileAppender appender = new RollingFileAppender();
        appender.setContext(loggerContext);
        // 设置appender的名称
        appender.setName(logFileName);
        // 创建活动日志(当天日志)打印文件
        appender.setFile(OptionHelper.substVars(LOG_BASE_PATH + logFileName + "/collection.log", loggerContext));
        // 设置日志是否追加到文件结尾,true:时是,false:否
        appender.setAppend(true);
        // 日志是否线程安全写入文件,true:是,false:否,默认false
        appender.setPrudent(false);

        // 定义滚动策略,按时间及大小进行滚动
        SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
        // 定义归档文件路径及名称
        String filePath = OptionHelper.substVars(LOG_BASE_PATH + logFileName + "/collection/.%d{yyyy-MM-dd}.%i.log", loggerContext);
        policy.setParent(appender);
        policy.setContext(loggerContext);
        // 设置单个文件大小
        policy.setMaxFileSize(FileSize.valueOf("50MB"));
        // 设置归档文件名
        policy.setFileNamePattern(filePath);
        // 设置归档文件保留的最大数量,这里设置30天
        policy.setMaxHistory(30);
        // 设置全部日志文件最大体积
        policy.setTotalSizeCap(FileSize.valueOf("2GB"));
        policy.start();

        //设置输出到日志文件的格式
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        // 日志格式
        encoder.setPattern("%d#|###|#%m%n");
        encoder.start();

        //设置输出到控制台的日志文件格式
        PatternLayoutEncoder encoder1 = new PatternLayoutEncoder();
        encoder1.setContext(loggerContext);
        encoder1.setPattern("%d %p (%file:%line\\)- %m%n");
        encoder1.start();

        /*设置动态日志控制台输出*/
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(loggerContext);
        consoleAppender.setEncoder(encoder1);
        consoleAppender.start();
        logger.addAppender(consoleAppender);


        // 设置appender记录日志的滚动策略
        appender.setRollingPolicy(policy);
        appender.setEncoder(encoder);
        appender.start();
        logger.addAppender(appender);

        return logger;

    }


}

在其它类中可以直接调用工具类LogAppenderConfig中的getLogger方法获取到对应的logger对象

// 定义
private static Logger logger = null;

// 方法中调用,入参test即为关键字,logger对象会将日志打印到/logs/test/文件夹下
logger = LogAppenderConfig.getLogger("test");

如图所示:
在这里插入图片描述

ps:至此,此次项目中自定义输出日志记录完毕,以备后用。水平有限,文章中如有错误或不当之处,欢迎批评指正,谢谢!

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值