项目日志输出配置总结(多数据源MyBatis+Logback)

一、配置核心目标

实现 MySQL、Oracle 双数据源的 MyBatis SQL 日志输出,满足两大需求:

  1. 控制台实时打印 SQL 日志(便于开发调试,查看执行语句、参数及结果);

  2. 按天生成日志文件(格式为 yyyyMMdd.txt,如 20250912.txt,支持历史日志追溯,自动清理过期日志)。

二、关键配置文件与代码

1. MyBatis 数据源配置类(2个,分别对应MySQL/Oracle)

作用:绑定数据源与 MyBatis 会话工厂,指定日志实现为 SLF4J(适配 Logback),同时配置 Mapper 路径和分页插件。

(1)MySQL 配置类:MyBatisMySQLConfig.java

核心配置点:

  • @MapperScan:指定 MySQL 专属 Mapper 接口包 com.hjt.point.mapper.mysql,关联 mysqlSqlSessionFactory

  • setLogImpl(Slf4jImpl.class):强制 MyBatis 使用 SLF4J 日志框架;

  • 配置 Mapper XML 路径 classpath:mapper/mysql/*.xml 和分页插件。

关键代码片段:

java 复制代码
@Configuration
@MapperScan(basePackages = "com.hjt.point.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MyBatisMySQLConfig {
    @Bean
    public SqlSessionFactory mysqlSqlSessionFactory(
            @Qualifier("mysqlDataSource") DataSource dataSource,
            @Qualifier("pageHelperInterceptorForMySQL") Interceptor pageHelperInterceptor) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        
        // 日志核心配置:绑定 SLF4J
        Configuration configuration = new Configuration();
        configuration.setLogImpl(Slf4jImpl.class); 
        configuration.setMapUnderscoreToCamelCase(true); // 可选:驼峰命名转换
        factoryBean.setConfiguration(configuration);
        
        // Mapper XML 路径
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/mysql/*.xml"));
        
        // 分页插件
        List<Interceptor> interceptors = new ArrayList<>();
        interceptors.add(pageHelperInterceptor);
        factoryBean.setPlugins(interceptors.toArray(new Interceptor[0]));
        
        return factoryBean.getObject();
    }
    
    // 事务管理器(多数据源必需)
    @Bean
    public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

注意:

代码中有两个Configuration,其中@Configuration来自于@org.springframework.context.annotation.Configuration;

而Configuration configuration = new Configuration()中的来自于import org.apache.ibatis.session.Configuration;

(2)Oracle 配置类:MyBatisOracleConfig.java

与 MySQL 配置逻辑一致,仅需替换「数据源标识」「Mapper 路径」:

  • @MapperScan 对应 Oracle Mapper 包 com.hjt.point.mapper.oracle

  • Mapper XML 路径为 classpath:mapper/oracle/*.xml

  • 关联 Oracle 数据源 oracleDataSource 和专属分页插件 pageHelperInterceptorForOracle

2. Logback 日志配置文件:logback-spring.xml

作用:定义日志输出规则(控制台+按天文件),关联双数据源的 Mapper 包,控制日志级别。 文件位置 :必须放在 src/main/resources 根目录(Spring Boot 自动扫描加载)。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 唯一根节点:所有Logback配置都必须放在<configuration>内部 -->
<configuration>

</configuration>

核心配置模块:

(1)控制台输出器(CONSOLE)

实时打印日志,包含时间、线程、日志级别、类名、日志内容,避免中文乱码:

XML 复制代码
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>
(2)按天滚动文件输出器(DAY_FILE)

实现日志按天归档,自动清理 30 天前日志,总大小限制 10GB(防止磁盘占满):

XML 复制代码
<appender name="DAY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/current.log</file> <!-- 当天日志临时文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/%d{yyyyMMdd}.txt</fileNamePattern> <!-- 归档文件名:20250912.txt -->
        <maxHistory>30</maxHistory> <!-- 保留30天日志 -->
        <totalSizeCap>10GB</totalSizeCap> <!-- 总大小限制 -->
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>
(3)双数据源日志绑定

指定 MySQL/Oracle 的 Mapper 包输出 DEBUG 级别日志,同时关联控制台和文件输出器,避免日志重复:

XML 复制代码
<!-- MySQL 数据源日志 -->
<logger name="com.hjt.point.mapper.mysql" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="DAY_FILE" />
</logger>
​
<!-- Oracle 数据源日志 -->
<logger name="com.hjt.point.mapper.oracle" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="DAY_FILE" />
</logger>
(4)全局根日志(可选)

注释状态下不影响核心功能,若开启需设置级别为 INFO(避免非必要日志冗余):

XML 复制代码
<!-- <root level="INFO">
    <appender-ref ref="CONSOLE" />
</root> -->

3. 依赖配置(无需额外引入,Spring Boot 默认包含)

Logback 依赖已通过 spring-boot-starter-webspring-boot-starter 间接引入,无需手动添加:

XML 复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

三、日志查看与验证

  1. 控制台查看:启动项目后执行数据库操作(如调用 Mapper 接口的查询方法),控制台会输出类似日志:

    java 复制代码
    2024-09-24 15:30:45.123 [main] DEBUG com.hjt.point.mapper.mysql.UserMapper - ==>  Preparing: SELECT * FROM user WHERE id = ? 
    2024-09-24 15:30:45.125 [main] DEBUG com.hjt.point.mapper.mysql.UserMapper - ==> Parameters: 123(Integer)
    2024-09-24 15:30:45.128 [main] DEBUG com.hjt.point.mapper.mysql.UserMapper - <==      Total: 1
  2. 文件查看

    • 当天日志:项目根目录 logs/current.log

    • 归档日志:次日自动将 current.log 重命名为 20240924.txt(按日期),存于 logs 文件夹下。

四、关键注意事项(避免配置失效)

  1. 包路径一致性@MapperScan 的 basePackages(如 com.hjt.point.mapper.mysql)必须与 Logback 中 <logger name> 完全一致,否则日志不输出;

  2. 配置文件位置logback-spring.xml 只能放在 src/main/resources 根目录,放错路径会导致配置不加载;

  3. 日志级别 :MyBatis SQL 日志为 DEBUG 级别,若误设为 INFO/WARN,会过滤掉 SQL 日志;

  4. 权限问题logs 文件夹需有写入权限(Windows 避免放 C 盘系统目录,Linux 执行 chmod 755 logs 赋予权限)。

相关推荐
哈喽姥爷2 天前
Spring Boot--yml配置信息书写和获取
java·数据库·spring boot·mybatis
奔跑你个Run3 天前
mybatis plus 使用wrapper输出SQL
mybatis
xrkhy3 天前
SpringBoot之日志处理(logback和AOP记录操作日志)
java·spring boot·logback
搬山境KL攻城狮3 天前
MacBook logback日志输出到绝对路径
java·intellij-idea·logback
躲在云朵里`3 天前
Spring Scheduler定时任务实战:从零掌握任务调度
java·数据库·mybatis
Java小白程序员4 天前
MyBatis基础到高级实践:全方位指南(中)
数据库·mybatis
山楂树下懒猴子4 天前
ChatAI项目-ChatGPT-SDK组件工程
人工智能·chatgpt·junit·https·log4j·intellij-idea·mybatis
中国胖子风清扬5 天前
Rust 日志库完全指南:从入门到精通
spring boot·后端·rust·学习方法·logback
Mr_hwt_1235 天前
基于mybatis-plus动态数据源实现mysql集群读写分离和从库负载均衡教程(详细案例)
数据库·spring boot·mysql·mybatis·mysql集群