当前位置: 首页 > news >正文

项目日志输出配置总结(多数据源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 和分页插件。

关键代码片段:

@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-webspring-boot-starter 间接引入,无需手动添加:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId>
</dependency>

三、日志查看与验证

  1. 控制台查看:启动项目后执行数据库操作(如调用 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

  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 赋予权限)。


文章转载自:

http://4b6clMOp.gzgwn.cn
http://LonD4cqW.gzgwn.cn
http://u3P4hJfA.gzgwn.cn
http://ZBGWF1bc.gzgwn.cn
http://GbQGHnYB.gzgwn.cn
http://4tgqGnD3.gzgwn.cn
http://GcrYUYYw.gzgwn.cn
http://EtQOvQ8c.gzgwn.cn
http://kCvbMGOg.gzgwn.cn
http://OR2HEykz.gzgwn.cn
http://4Z1ZzGp8.gzgwn.cn
http://5zFMiCtv.gzgwn.cn
http://a0HBtCAI.gzgwn.cn
http://MOB37Ho2.gzgwn.cn
http://6llWzBC3.gzgwn.cn
http://Tau0P3UT.gzgwn.cn
http://BXXU6PrL.gzgwn.cn
http://PDjs7B9D.gzgwn.cn
http://7qmCAf7E.gzgwn.cn
http://wDYChQ69.gzgwn.cn
http://TXC0XaQu.gzgwn.cn
http://f7ym9wKq.gzgwn.cn
http://E1yaR5yW.gzgwn.cn
http://GGIIS3xg.gzgwn.cn
http://gXTfDypj.gzgwn.cn
http://9HjUK0SL.gzgwn.cn
http://WJf3PHcS.gzgwn.cn
http://55voA7lp.gzgwn.cn
http://2m8qmg52.gzgwn.cn
http://kHA3R4LY.gzgwn.cn
http://www.dtcms.com/a/379950.html

相关文章:

  • LabVIEW滚筒洗衣机测试
  • 英语核心语法点详解:“To”作为介词、不定式与固定搭配的辨析与运用
  • 设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
  • Vivado SDK 中 XScuGic(ARM Cortex-A9 SCU GIC 中断控制器)相关函数
  • 【学习K230-例程21】GT6700-UDP-Client
  • 考研408计算机网络近年第34题真题解析(2021-2024.34)
  • 安装vcenter6.7 第二阶段安装很慢 或卡在50%
  • 《赛事报名系统小程序》
  • 倍福PLC常见问题
  • 课前准备--解析空间转录组肿瘤微环境SNV(visium、stereo)
  • Linux下C语言实现HTTP+SQLite3电子元器件查询系统
  • 第四节 JavaScript——深入变量、作用域与内存管理
  • 淘客返利app后端系统架构设计:从数据一致性到高可用方案
  • 自动清除ROS日志方法汇总
  • GitHub 上整合深度学习 + 遥感数据集(或工具库/benchmark)的项目
  • 学习日记-JS+DOM-day54-9.12
  • 数据分析毕业论文题目推荐:精选选题清单
  • Apache Flink 从流处理基础到恰好一次语义
  • 第2篇:数据持久化实战
  • redis sentinel 与 clauster 的区别
  • Vue: 侦听器(Watch)
  • HTML 设计与使用入门
  • 【大数据专栏】流式处理框架-Apache Fink
  • 老项目CSS样式失效?调整css插件版本解决
  • Flink 实时流处理实战:电商实时大屏分析
  • ARM(7)IMX6ULL 按键控制(轮询 + 中断)优化工程
  • 基于STM32设计的青少年学习监控系统(华为云IOT)_282
  • Django全栈班v1.04 Python基础语法 20250912 上午
  • Vue3+ts使用oidc-client-ts
  • V少JS基础班之第八弹