我使用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 logging

MyBatis通过使用内部日志工厂来提供日志信息。内部日志工厂会将日志记录信息委派给以下日志实现之一:

SLF4J
Apache Commons日志记录
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)上找到更多信息。或者,您可以简单地尝试一下它,看看不同的配置选项有什么作用。

07-24 09:49
查看更多