mybatis plus打印sql日志

1、官方文档

使用配置 | MyBatis-Plus

2、日志实现

MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明:

  1. StdOutImpl:将日志信息输出到控制台,适用于开发和测试环境。在配置文件中设置 log-implorg.apache.ibatis.logging.stdout.StdOutImpl 可以开启控制台 SQL 日志打印 。

  2. NoLoggingImpl:不记录任何日志信息,适用于生产环境,以避免日志泄露可能的敏感信息。配置方式为设置 log-implorg.apache.ibatis.logging.nologging.NoLoggingImpl 来关闭 SQL 日志打印 。

  3. Slf4jImpl:使用 SLF4J 作为日志框架,可以与 Logback、Log4j2 等日志实现配合使用。配置方式为设置 log-implorg.apache.ibatis.logging.slf4j.Slf4jImpl

  4. JakartaCommonsLoggingImplJdk14LoggingImplLog4jImpl 等:这些是 MyBatis-Plus 支持的其他日志实现,可以根据项目中使用的日志框架进行选择 。

  5. 自定义日志实现:MyBatis-Plus 还允许开发者通过实现 Log 接口来扩展自定义的日志输出方式。可以使用 LogFactoryuseCustomLogging 方法来指定自定义日志类。

此外,MyBatis-Plus 通过 LogFactory 日志工厂来确定使用哪种日志实现。如果没有明确指定,它会尝试使用一系列内置日志实现,直到找到合适的日志类或者禁用日志功能。

在实际使用中,可以根据项目需求和环境配置相应的日志实现,以便于更好地监控和调试应用程序。例如,可以在项目启动时通过控制台输出的提示信息来确认当前使用的日志实现方式。如果需要将 SQL 日志和参数打印到日志文件中,可以考虑使用支持文件输出的日志框架,如 Logback 或 Log4j2,并进行相应的配置。

3、自定义日志实现(推荐)

创建自定义日志实现

首先,我们需要创建一个实现了org.apache.ibatis.logging.Log接口的类,该类会将所有原本打算以DEBUG级别记录的日志改为以INFO级别记录。

复制代码
package com.ybw.config;

import org.apache.ibatis.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * mybatis日志级别改为info
 *
 * @author ybw
 * @version V1.0
 * @className InfoLevelLog
 * @date 2024/12/2
 **/
public class InfoLevelLogger implements Log {

    private final Logger logger;

    public InfoLevelLogger(String clazz) {
        this.logger = LoggerFactory.getLogger(clazz);
    }

    @Override
    public boolean isDebugEnabled() {
        return logger.isInfoEnabled();
    }

    @Override
    public void error(String s, Throwable e) {
        logger.error(s, e);
    }

    @Override
    public void error(String s) {
        logger.error(s);
    }

    @Override
    public void debug(String s) {
        // 修改这里
        logger.info(s);
    }

    @Override
    public void warn(String s) {
        logger.warn(s);
    }

    @Override
    public boolean isTraceEnabled() {
        // 如果需要,也可以将TRACE级别的日志改为INFO
        return logger.isInfoEnabled();
    }

    @Override
    public void trace(String s) {
        // 修改这里
        logger.trace(s);
    }
}

注册自定义日志实现

mybatis配置
复制代码
mybatis:
  configuration:
    log-impl: com.ybw.config.InfoLevelLogger
mybatis-plus配置
复制代码
mybatis-plus:
  configuration:
    log-impl: com.ybw.config.InfoLevelLogger

测试验证

复制代码
[INFO ] 2024-12-02 14:37:20.403 [main] org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
[INFO ] 2024-12-02 14:37:20.420 [main] org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a3643e3] was not registered for synchronization because synchronization is not active
[INFO ] 2024-12-02 14:37:20.517 [main] o.m.s.t.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3e4afd10] will not be managed by Spring
[INFO ] 2024-12-02 14:37:20.528 [main] c.y.mapper.TestYearMapper.selectList - ==>  Preparing: SELECT id,receive_year FROM test_year WHERE (receive_year = ?)
[INFO ] 2024-12-02 14:37:20.660 [main] c.y.mapper.TestYearMapper.selectList - ==> Parameters: 2024(Integer)
[INFO ] 2024-12-02 14:37:20.751 [main] c.y.mapper.TestYearMapper.selectList - <==    Columns: id, receive_year
[INFO ] 2024-12-02 14:37:20.753 [main] c.y.mapper.TestYearMapper.selectList - <==        Row: 1, 2024-01-01
[INFO ] 2024-12-02 14:37:20.756 [main] c.y.mapper.TestYearMapper.selectList - <==      Total: 1
[INFO ] 2024-12-02 14:37:20.762 [main] org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a3643e3]
[INFO ] 2024-12-02 14:37:20.923 [main] com.ybw.service.TestYearServiceTest - list:[{"id":1,"receiveYear":{"leap":true,"value":2024}}]

源代码

share: 分享仓库 - Gitee.com

4、动态配置

代码实现

复制代码
/**
 * sql打印日志
 * package命名为mapper方式实现
 *
 * @methodName: configureLoggers
 * @return: void
 * @author: ybw
 * @date: 2024/7/4
 **/
@Bean
public void configureLoggers() {
    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
    Set<String> mapperPackages = findPackagesWithMapper();
    if (CollectionUtils.isEmpty(mapperPackages)) {
        return;
    }
    mapperPackages.forEach(packageName -> {
        // 设置packageName包的日志级别为DEBUG
        context.getLogger(packageName).setLevel(Level.DEBUG);
    });
}

/**
 * 扫描包下所有mapper
 *
 * @methodName: findPackagesWithMapper
 * @return: java.util.Set<java.lang.String>
 * @author: ybw
 * @date: 2024/7/4
 **/
public Set<String> findPackagesWithMapper() {
    // 使用Spring的PathMatchingResourcePatternResolver来查找资源
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);

    // 示例资源路径,根据实际情况调整
    String packageSearchPath = "classpath*:**/" + MybatisPlusConstant.Package.BASE_PACKAGE + "/**/*.class";
    try {
        Resource[] resources = resolver.getResources(packageSearchPath);
        Set<String> packagesWithMapper = new HashSet<>();
        for (Resource resource : resources) {
            if (resource.isReadable()) {
                MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
                String packageName = ClassUtils.getPackageName(metadataReader.getClassMetadata().getClassName());
                if (packageName.contains(MybatisPlusConstant.Package.PACKAGE_KEYWORD)) {
                    packagesWithMapper.add(packageName);
                }
            }
        }
        return packagesWithMapper;
    } catch (IOException e) {
        log.error("findPackagesWithMapper error:", e);
    }
    return new HashSet<>();
}

源代码

share: 分享仓库 - Gitee.com

相关推荐
韩立学长2 分钟前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚38 分钟前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设1 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919101 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓1 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525292 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊3 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha3 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全