2

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

<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 日志记录页面和此答案中所述,我使用了 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 中删除了 common-logging。但这似乎也行不通。

  • 如何设置 MyBatis 打印所有的 sql 查询(PreparedStatements)?
  • 如果 MyBatis 没有检测到 log4j,有没有办法告诉 MyBatis 使用 log4j 作为默认的日志框架而不使用mybatis-config.xml
4

1 回答 1

4

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

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

这里提到了其他登录框架的其他方法。

如果你选择调用这些方法之一,你应该在调用任何其他 MyBatis 方法之前这样做。此外,如果该实现在运行时类路径上可用,这些方法只会切换到请求的日志实现。例如,如果您尝试选择 Log4J 日志记录并且 Log4J 在运行时不可用,那么 MyBatis 将忽略使用 Log4J 的请求,并将使用它的正常算法来发现日志记录实现。

我还在 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>

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

[DEBUG] org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
于 2016-03-22T10:13:57.567 回答