如何在 Spring 中为 MyBatis SQL 查询配置 Log4j?

How to configure Log4j in Spring for MyBatis SQL queries?

我有一个带有 mybatis 3.3.0 和 mybatis-spring 1.2.3 的 Spring MVC 项目,我想在我的项目中配置 log4j。而且我没有使用 mybatis-config.xml 来设置 mybatis sql 会话工厂。所以我不能使用下面的设置,

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

所以,我的

中有以下配置

spring-context.xml,

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="typeAliasesPackage" value="com.sample.model"/>
  <property name="mapperLocations" value="classpath*:com/sample/mappers/*.xml" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.sample.mappers" />
</bean>

并配置了这个log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%p] %c{1} - %m%n"/>
    </layout>
  </appender>

  <logger name="java.sql" additivity="false">
    <level value="debug"/>
   <appender-ref ref="STDOUT"/> 
  </logger>

  <logger name="org.apache.ibatis" additivity="false">
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
  </logger>

  <logger name="org.mybatis.spring" additivity="false">
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
  </logger>

  <logger name="com.sample.mappers">
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
  </logger>

  <root>
    <priority value ="debug" />
    <appender-ref ref="STDOUT" />
  </root>

</log4j:configuration>

以上配置不打印执行的 sql 查询或准备好的语句。因此,如 mybatis logging page and from this answer 中所述,我使用 log4j.properties 而不是 xml 配置,

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout

# MyBatis logging configuration...
log4j.logger.com.sample.mappers=DEBUG

# SqlMap logging configuration.
log4j.logger.org.mybatis.spring=DEBUG
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.org.apache.ibatis.jdbc.ScriptRunner=DEBUG

log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%p] %c{1} - %m%n

我也从 pom.xml 中删除了公共日志记录。但这似乎也行不通。

我找到了解决方案,现在我可以在我的控制台中看到所有准备好的语句和所有 Mapper 接口查询和参数。在调用任何 MyBatis 查询之前在服务器启动后调用这行代码工作正常,

org.apache.ibatis.logging.LogFactory.useLog4JLogging();

其他登录框架的其他方法是mentioned here

If you choose to call one of these methods, you should do so before calling any other MyBatis method. Also, these methods will only switch to the requested log implementation if that implementation is available on the runtime classpath. For example, if you try to select Log4J logging and Log4J is not available at runtime, then MyBatis will ignore the request to use Log4J and will use it's normal algorithm for discovering logging implementations.

我还在pom.xml,

中隐藏了以下两个依赖
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.1</version>
</dependency>

一旦我使用 useLog4JLogging() 方法设置使用 log4j 作为默认记录器,在控制台中我可以看到 MyBatis 现在选择 log4j 作为它的记录器框架。

[DEBUG] org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.