springboot使用tk.mybatis通用mapper使用log4j打印sql

本文介绍如何在SpringBoot项目中配置并使用Log4j进行日志记录,包括排除默认日志框架,引入Log4j依赖,配置log4j.properties文件,以及在启动类中设置日志配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot使用log4j打日志,非常简单,首页需要在pom文件中屏蔽掉默认的日志方式spring-boot-starter-logging,并引入log4j相关依赖(如果其他依赖也使用了跟log4j不相容的也排除掉即可):

<!-- log4j start -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
</dependency>
<!-- log4j end -->

在项目目录下创建res文件夹,创建log4j.properties文件,你也可以放到src/main/resources下面,此时不需要再加如下的语句:

PropertyConfigurator.configure(System.getProperty("logging.config", "res/log4j.properties"));

我们这里使用res目录是考虑到不同的环境可能需要不同的日志级别,只需要修改res目录下的配置即可。在启动类中这样设置:

@EnableAutoConfiguration
@ComponentScan(basePackages = "cn.lovecto.promotion")
@MapperScan(basePackages = "cn.lovecto.promotion.dao.mapper")//数据库访问mapper接口所在包名
@EnableScheduling
@EnableAsync
@EnableTransactionManagement
public class Application {

    public static void main(String[] args) {
        //放到自定义的res目录下的方式
        PropertyConfigurator.configure(System.getProperty("logging.config", "res/log4j.properties"));
        SpringApplication.run(Application.class, args);
    }

}

log4j.properties在springboot中的配置并没有什么特殊说明的,由于我们使用tk.mybatis通用mapper,如果要打印日志查看sql,可以在log4j.properties中加入如下内容即可。

log4j.rootLogger=INFO,err,stdout
#数据库访问mapper接口所在包日志级别
log4j.logger.cn.lovecto.promotion.dao.mapper=DEBUG,db

#db.log,每天一个文件
log4j.logger.db=DEBUG,db
log4j.appender.db=org.apache.log4j.DailyRollingFileAppender
log4j.appender.db.Threshold=DEBUG
log4j.appender.db.File=./logs/db.log
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH\:mm\:ss} [%F\:%L] %m %n

运行单元测试,控制台和db.log中打印出:

DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] ==>  Preparing: SELECT id,promotion_name,advance_start_time,booking_start_time,booking_end_time,checkin_start_time,checkin_end_time,promotion_type,promotion_value,promotion_icon,remark,enable_inventory,inventory,promotion_price_icon,inventory_factor,use_coupon,max_ordernum,enable_refund,refund_percent,quantity_limit,status FROM promotion WHERE ( booking_start_time >= ? and booking_end_time < ? )  
DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] ==> Parameters: 2018-08-03 15:52:28.123(Timestamp), 2018-08-03 15:52:28.123(Timestamp) 
DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] <==      Total: 0 
### 关于 TKMyBatis打印 SQL 执行日志的解决方案 #### 日志框架配置问题分析 当使用 `TKMyBatis` 或其他基于 MyBatis 的工具时,SQL 执行日志未正常打印可能与日志框架的配置有关。根据描述,在某些情况下可能会出现死循环的日志打印现象[^2]。这种行为通常是由以下几个原因引起的: 1. **日志框架冲突** 如果项目中同时存在多个日志框架(如 Log4j 和 SLF4J),可能导致日志输出混乱甚至无法正确记录日志。 2. **MyBatis 配置错误** MyBatis 默认支持多种日志实现方式(Log4j, Commons Logging,Slf4j 等)。如果在配置文件中指定的日志实现与实际使用的日志库不匹配,则可能出现日志丢失的情况。 3. **SqlSessionFactory 配置不当** 当直接配置 `org.mybatis.spring.SqlSessionFactoryBean` 时,若其内部逻辑出现问题(例如日志初始化失败),则可能导致程序进入死循环而无异常提示。 --- #### 解决方案 以下是几种常见的解决方法来确保 SQL 执行日志能够被正确打印: ##### 方法一:调整日志级别 确认当前项目的日志框架及其配置是否允许显示 SQL 执行日志。对于常用的 Log4j 来说,可以通过修改 `log4j.properties` 文件设置合适的日志级别: ```properties # 设置 MyBatis 日志级别为 DEBUG log4j.logger.org.mybatis=DEBUG log4j.logger.com.example.mapper=DEBUG ``` 上述配置会启用 MyBatisMapper 层的相关调试信息,从而可以查看 SQL 执行情况[^1]。 ##### 方法二:自定义 SqlSessionFactory 实现 为了避免因默认 `SqlSessionFactoryBean` 初始化过程中潜在的问题而导致的日志异常,建议创建一个继承自 `SqlSessionFactoryBean` 的子类并覆盖其核心方法。具体做法如下所示: ```java import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; public class CustomSqlSessionFactoryBean extends SqlSessionFactoryBuilder { @Override public SqlSessionFactory buildSqlSessionFactory() throws Exception { try { return super.buildSqlSessionFactory(); } catch (Exception e) { System.err.println("Error occurred while building SqlSessionFactory: " + e.getMessage()); throw e; // 将捕获到的异常重新抛出以便进一步处理 } } } ``` 通过这种方式可以在发生错误时及时定位问题所在,并避免陷入无限循环状态。 ##### 方法三:切换至更稳定的替代品 考虑到 `TKMyBatis` 功能相对单一且维护频率较低,推荐考虑迁移到功能更为强大且社区活跃度更高的同类产品——比如 `MyBatis-Plus`。后者不仅提供了丰富的特性集还内置完善的日志管理机制,极大简化了开发者的工作量。 --- ### 总结 针对 `TKMyBatis` 中 SQL 执行日志未能成功打印这一状况,可以从调整日志框架参数、重构 `SqlSessionFactory` 构建流程以及评估升级至更适合的技术栈这三个角度出发寻找对策。每种策略各有优劣需依据实际情况灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值