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

时间:2015-11-17 05:32:44

标签: java spring log4j mybatis

我使用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)。谁能帮我?非常感谢你!

2 个答案:

答案 0 :(得分:3)

您可以参考mybatis logging

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

<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 Logging Apache Log4j 1.x和2.x. JDK Logging 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 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文件中的其余配置用于配置appender,这超出了本文档的范围。但是,您可以在Log4J网站(上面的URL)上找到更多信息。或者,您可以简单地尝试使用它来查看不同配置选项的效果。

答案 1 :(得分:0)

也许您查看此详细信息: http://www.mybatis.org/mybatis-3/logging.html 希望它有效!