mybatis 控制台打印不了SQL 解决办法

439 阅读3分钟

建议第一步区分环境(生产环境严格限制答应sql,测试环境允许) spring.profiles.active=label:testspring.profiles.active={label:test} spring.profiles.active={label:prod}

参考文件-官方解决方案文档 mybatis.org/mybatis-3/z…

日志

Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j (3.5.9 起废弃)
  • JDK logging

MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging,所以在这种配置环境下的 MyBatis 会把它作为日志工具,记住这点非常重要。这将意味着,在诸如 WebSphere 的环境中,它提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。MyBatis 将你的 Log4J 配置忽略掉是相当令人郁闷的(事实上,正是因为在这种配置环境下,MyBatis 才会选择使用 Commons Logging 而不是 Log4J)。如果你的应用部署在一个类路径已经包含 Commons Logging 的环境中,而你又想使用其它日志工具,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择别的日志工具。

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J"/>
    ...
  </settings>
</configuration>

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
<setting name="logImpl" value="STDOUT_LOGGING"/>

logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口 org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。(译者注:可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)

你也可以调用如下任一方法来使用日志工具:

org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();

如果你决定要调用以上某个方法,请在调用其它 MyBatis 方法之前调用它。另外,仅当运行时类路径中存在该日志工具时,调用与该日志工具对应的方法才会生效,否则 MyBatis 一概忽略。如你环境中并不存在 Log4J2,你却调用了相应的方法,MyBatis 就会忽略这一调用,转而以默认的查找顺序查找日志工具。

示例:


@Bean("dataSource")
DynamicRoutingDataSource createDataSource(@Qualifier("dataSourceHelper") DataSourceHelper dataSourceHelper) {
   //todo 判断环境信息
    org.apache.ibatis.logging.LogFactory.useStdOutLogging();
    
    com.xxxdataSource.DynamicRoutingDataSource dataSource = new com.xxxdataSource.DynamicRoutingDataSource();
    dataSource.setDataSourceHelper(dataSourceHelper);
    return dataSource;
}



### 其他 @SpringBootApplication 里面已经使用了  @ComponentScan(basePackages = {"com.xxxx"}),启动类不用添加

```js
   @SpringBootApplication(scanBasePackages = {"com.xxx"}, exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)
    public class Application {

UML 图.jpg

org.apache.ibatis.logging.nologging.NoLoggingImpl,这是一个空的日志实现,不会记录任何日志信息

MyBatis 中,log-impl 配置项用于指定 MyBatis 所使用的日志实现。MyBatis 支持多种日志框架,包括 SLF4J、LOG4J2、JDK logging 等。如果你想要禁用 MyBatis 的日志记录功能,可以使用 org.apache.ibatis.logging.nologging.NoLoggingImpl,这是一个空的日志实现,不会记录任何日志信息。

如果你想在 MyBatis 的配置文件中设置这个日志实现,可以在 mybatis-config.xml 文件中的 <configuration> 标签添加以下配置:

<configuration>
    <!-- 其他配置... -->

    <!-- 设置 MyBatis 使用的日志实现 -->
    <settings>
        <setting name="logImpl" value="org.apache.ibatis.logging.nologging.NoLoggingImpl"/>
    </settings>

    <!-- 其他配置... -->
</configuration>

或者,如果你使用的是 Java 代码配置 MyBatis,可以这样做:

import org.apache.ibatis.session.Configuration;

// 创建 MyBatis 配置对象
Configuration configuration = new Configuration();

// 设置日志实现为不记录日志
configuration.setLogImpl(NoLoggingImpl.class);

// 接下来使用这个配置对象来创建 SqlSessionFactory
// ...

请注意,禁用日志记录可能会让调试变得更加困难,因为日志是了解应用程序运行时行为的重要手段。因此,通常只在生产环境中为了性能考虑而禁用日志记录。在开发和测试阶段,建议保留日志记录功能以便于问题排查。