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

我使用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] - %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] - %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] - %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] - %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] - %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文件中添加设置来选择不同的日志记录实现,如下所示:

   ...  ...   

有效值为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作为提供程序配置完整日志记录服务。 有两个步骤。

第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 

但是如果你不使用mapper接口但是像这样的mapper XML文件呢?

      

在这种情况下,您可以通过为命名空间添加记录器来启用整个XML文件的日志记录,如下所示:

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

或者对于特定声明:

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

是的,您可能已经注意到,配置映射器接口或XML映射器文件的日志记录没有区别。

注意如果您使用的是SLF4J或Log4j,MyBatis将使用标记MYBATIS调用它。

log4j.properties文件中的其余配置用于配置appender,这超出了本文档的范围。 但是,您可以在Log4J网站(上面的URL)上找到更多信息。 或者,您可以简单地试验它以查看不同配置选项的效果。

也许你查看这个细节: http : //www.mybatis.org/mybatis-3/logging.html希望它有效!