2016-03-22 190 views
1

我有MyBatis的3.3.0和MyBatis的彈簧1.2.3的一個Spring MVC的項目,我想在我的項目配置log4j。而且我沒有使用mybatis-config.xml設立MyBatis的SQL會話工廠。所以我不能使用以下設置,如何配置Log4j在Spring爲MyBatis的SQL查詢?

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

所以,我在我的

彈簧的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頁和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中取出過。但是,這似乎也不起作用。

  • 如何設置MyBatis打印所有的SQL查詢(PreparedStatements)?
  • 如果萬一MyBatis沒有檢測到log4j,有什麼辦法告訴MyBatis使用log4j作爲默認日誌框架而不使用mybatis-config.xml

回答

2

我找到了解決方案,現在我可以在控制檯中看到所有準備好的語句和所有Mapper接口查詢參數&。調用這行代碼一旦服務器調用任何MyBatis的查詢之前啓動工作正常,

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

其他洛框架其他方法mentioned here

如果您選擇調用其中一種方法,您應該在調用任何其他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> 

一旦我設定使用useLog4JLogging()方法使用log4j的默認記錄器,在控制檯中我能看到的MyBatis拿起log4j的作爲它的記錄器框架現在。

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

我應該在哪裏調用org.apache.ibatis.logging.LogFactory.useLog4JLogging(); ?請記住,我沒有(任何一個)xml文件 - 全部配置在註釋中 –

+0

@HaskellFun在mybatis執行之前用任何控制器方法調用它。我在我的控制器方法中顯示主頁屏幕,它在調用mybatis查詢之前。確定您的應用程序中調用的第一個mybatis查詢,並在此之前調用該方法。適用於完全註解配置的應用程序。 – Lucky