项目日志输出配置总结(多数据源MyBatis+Logback)
一、配置核心目标
实现 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
和分页插件。
关键代码片段:
@Configuration
@MapperScan(basePackages = "com.hjt.point.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MyBatisMySQLConfig {@Beanpublic SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource,@Qualifier("pageHelperInterceptorForMySQL") Interceptor pageHelperInterceptor) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 日志核心配置:绑定 SLF4JConfiguration 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();}// 事务管理器(多数据源必需)@Beanpublic 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 version="1.0" encoding="UTF-8"?>
<!-- 唯一根节点:所有Logback配置都必须放在<configuration>内部 -->
<configuration></configuration>
核心配置模块:
(1)控制台输出器(CONSOLE)
实时打印日志,包含时间、线程、日志级别、类名、日志内容,避免中文乱码:
<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(防止磁盘占满):
<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
级别日志,同时关联控制台和文件输出器,避免日志重复:
<!-- 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
(避免非必要日志冗余):
<!-- <root level="INFO"><appender-ref ref="CONSOLE" />
</root> -->
3. 依赖配置(无需额外引入,Spring Boot 默认包含)
Logback 依赖已通过 spring-boot-starter-web
或 spring-boot-starter
间接引入,无需手动添加:
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId>
</dependency>
三、日志查看与验证
控制台查看:启动项目后执行数据库操作(如调用 Mapper 接口的查询方法),控制台会输出类似日志:
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
文件查看:
当天日志:项目根目录
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
赋予权限)。