一、配置核心目标
实现 MySQL、Oracle 双数据源的 MyBatis SQL 日志输出,满足两大需求:
-
控制台实时打印 SQL 日志(便于开发调试,查看执行语句、参数及结果);
-
按天生成日志文件(格式为
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-web
或 spring-boot-starter
间接引入,无需手动添加:
XML
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
三、日志查看与验证
-
控制台查看:启动项目后执行数据库操作(如调用 Mapper 接口的查询方法),控制台会输出类似日志:
java2024-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
-
文件查看:
-
当天日志:项目根目录
logs/current.log
; -
归档日志:次日自动将
current.log
重命名为20240924.txt
(按日期),存于logs
文件夹下。
-
四、关键注意事项(避免配置失效)
-
包路径一致性 :
@MapperScan
的 basePackages(如com.hjt.point.mapper.mysql
)必须与 Logback 中<logger name>
完全一致,否则日志不输出; -
配置文件位置 :
logback-spring.xml
只能放在src/main/resources
根目录,放错路径会导致配置不加载; -
日志级别 :MyBatis SQL 日志为
DEBUG
级别,若误设为INFO
/WARN
,会过滤掉 SQL 日志; -
权限问题 :
logs
文件夹需有写入权限(Windows 避免放 C 盘系统目录,Linux 执行chmod 755 logs
赋予权限)。