簡體   English   中英

Mybatis log4j如何配置log4j將sql日志打印到文件

[英]Mybatis log4j how to confiure log4j to print sql log to file

我使用Spring 4和MyBatis 3,想確認log4j打印sql日志,例如連接,選擇,插入,更新,刪除,聲明,preparedStatement,resultSet到日志文件。

我的log4j.properties如下:

### set log levels ###
log4j.rootLogger=debug, stdout, log, index, D, I, W, E
#log4j.rootLogger = debug,error, log, index, D, I, W, E
log4j.FilePath=${catalina.home}/app_log
###  print log to console ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d %p [%c] - <%m>%n

###  print log to console ###
log4j.appender.error = org.apache.log4j.ConsoleAppender
log4j.appender.error.Target = System.out
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d %p [%c] - <%m>%n

### create log to file ###
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.File = ${log4j.FilePath}/all.log
#log4j.appender.log.MaxFileSize = 1024KB
log4j.appender.log.Encoding = UTF-8
log4j.appender.log.Append = true
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern= %d %p [%c] - <%m>%n
log4j.additivity.com.packagename = true 


###  create log on lever debug ###
log4j.appender.D = org.apache.log4j.RollingFileAppender
log4j.appender.D.File = ${log4j.FilePath}/debug.log
log4j.appender.D.MaxFileSize = 1024KB
log4j.appender.D.Encoding = UTF-8
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern= %d %p [%c] - <%m>%n
log4j.appender.D.MaxBackupIndex = 10


###  create log on lever error ###
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = ${log4j.FilePath}/error.log
log4j.appender.E.MaxFileSize = 1024KB
log4j.appender.E.Encoding = UTF-8
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern= %d %p [%c] - <%m>%n
log4j.appender.E.MaxBackupIndex = 10


# If programmed properly the most messages would be at DEBUG 
# and the least at FATAL.

# Control logging for other open source packages
log4j.logger.net.sf.navigator=ERROR
log4j.logger.net.sf.acegisecurity=WARN
log4j.logger.net.sf.acegisecurity.intercept.event.LoggerListener=WARN
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.velocity=WARN
log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG


# SqlMap logging configuration...
log4j.logger.com.ibatis=debug,stdout,log
log4j.logger.com.ibatis.db=debug,stdout,log
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug,stdout,log
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=debug,stdout,log
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=debug,stdout,log
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=debug,stdout,log
log4j.logger.com.ibatis.common.util.StopWatch=debug,stdout,log
log4j.logger.org.apache.ibatis=debug,stdout,log
log4j.logger.org.mybatis.spring=debug,stdout,log
log4j.logger.org.mybatis.spring.SqlSessionUtils=WARN
log4j.logger.org.springframework.jdbc.datasource.DataSourceTransactionManager=debug,stdout,log

log4j.logger.org.mybatis.example=TRACE



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

它在控制台中打印sql日志,但不將sql日志打印到日志文件(例如all.log)。 誰能幫我? 非常感謝你!

您可以參考mybatis日志記錄

MyBatis通過使用內部日志工廠來提供日志信息。 內部日志工廠會將日志記錄信息委派給以下日志實現之一:

SLF4J Apache Commons Logging Log4j 2 Log4j JDK日志記錄所選的日志記錄解決方案基於內部MyBatis日志工廠的運行時自省。 MyBatis日志工廠將使用它找到的第一個日志記錄實現(按上述順序搜索實現)。 如果MyBatis未找到上述任何實現,則將禁用日志記錄。

許多環境將Commons Logging作為應用程序服務器類路徑的一部分提供(很好的例子包括Tomcat和WebSphere)。 重要的是要知道,在這樣的環境中,MyBatis將使用Commons Logging作為日志記錄實現。 在像WebSphere這樣的環境中,這將意味着您的Log4J配置將被忽略,因為WebSphere提供了自己的Commons Logging專有實現。 這可能非常令人沮喪,因為MyBatis似乎忽略了Log4J配置(實際上,MyBatis忽略了Log4J配置,因為MyBatis在此類環境中將使用Commons Logging)。 如果您的應用程序在類路徑中包含Commons Logging的環境中運行,但是您寧願使用其他日志記錄實現中的一種,則可以通過在mybatis-config.xml文件中添加一個設置來選擇其他日志記錄實現,如下所示:

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

有效值為SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING或實現org.apache.ibatis.logging.Log並獲取字符串作為構造函數參數的完全合格的類名。

您還可以通過調用以下方法之一來選擇實現:

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

如果選擇調用這些方法之一,則應在調用任何其他MyBatis方法之前進行調用。 同樣,只有在運行時類路徑上可以使用所請求的日志實現時,這些方法才會切換到該請求。 例如,如果您嘗試選擇Log4J日志記錄,而Log4J在運行時不可用,則MyBatis將忽略使用Log4J的請求,並將使用它的常規算法來發現日志記錄實現。

SLF4J,Apache Commons Logging,Apache Log4J和JDK Logging API的詳細信息超出了本文檔的范圍。 但是,下面的示例配置將幫助您入門。 如果您想進一步了解這些框架,可以從以下位置獲得更多信息:

SLF4J Apache Commons日志記錄Apache Log4j 1.x和2.x JDK日志記錄API日志記錄配置要查看MyBatis日志記錄語句,可以啟用包記錄,映射器完全限定的類名,名稱空間或完全限定的語句名。

同樣,您如何執行此操作取決於所使用的日志記錄實現。 我們將展示如何使用Log4J做到這一點。 配置日志記錄服務僅是包括一個或多個其他配置文件(例如log4j.properties),有時還包括一個新的JAR文件(例如log4j.jar)的問題。 以下示例配置將使用Log4J作為提供程序來配置完整的日志記錄服務。 有2個步驟。

步驟1:添加Log4J JAR文件

因為我們正在使用Log4J,所以我們需要確保其JAR文件可用於我們的應用程序。 要使用Log4J,您需要將JAR文件添加到您的應用程序類路徑中。 您可以從上面的URL下載Log4J。

對於Web或企業應用程序,您可以將log4j.jar添加到WEB-INF / lib目錄中,或者對於獨立應用程序,只需將其添加到JVM -classpath啟動參數中即可。

步驟2:配置Log4J

配置Log4J很簡單。 假設您要為此映射器啟用日志:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

創建一個名為log4j.properties的文件,如下所示,並將其放在您的類路徑中:

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

上面的文件將使log4J報告org.mybatis.example.BlogMapper的詳細日志記錄,而對於應用程序的其余類僅報告錯誤。

如果要更精細地調整日志記錄,可以為特定語句而不是整個映射器文件打開日志記錄。 以下行將僅針對selectBlog語句啟用日志記錄:

log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE

相反,您可能想要啟用一組映射器的日志記錄。 在這種情況下,您應該將映射器所在的根軟件包添加為記錄器:

log4j.logger.org.mybatis.example=TRACE

有些查詢可以返回巨大的結果集。 在這種情況下,您可能想查看SQL語句,而不是結果。 為此,SQL語句在DEBUG級別(JDK日志記錄中為FINE)記錄,結果在TRACE級別(JDK日志記錄中為FINER)記錄,因此,如果要查看該語句而不是結果,請將級別設置為DEBUG。

log4j.logger.org.mybatis.example=DEBUG

但是,如果您不使用映射器接口,而是使用像這樣的映射器XML文件呢?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

在這種情況下,您可以通過添加名稱空間的記錄器來啟用整個XML文件的記錄,如下所示:

log4j.logger.org.mybatis.example.BlogMapper=TRACE

或針對特定聲明:

log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE

是的,您可能已經注意到,為映射器接口或XML映射器文件配置日志記錄沒有區別。

注意如果使用的是SLF4J或Log4j,2 MyBatis將使用標記MYBATIS對其進行調用。

log4j.properties文件中的其余配置用於配置附加程序,這超出了本文檔的范圍。 但是,您可以在Log4J網站(上面的URL)上找到更多信息。 或者,您可以簡單地嘗試一下它,看看不同的配置選項有什么作用。

也許您可以查看以下詳細信息: http : //www.mybatis.org/mybatis-3/logging.html希望它能起作用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM