mybatis log4j如何配置log4j打印sql日志到文件
Mybatis log4j how to confiure log4j to print sql log to file
我用的是Spring4和MyBatis 3,想配置log4j打印sql日志如connection,select,insert,update,delete,statement,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)。谁能帮我?非常感谢!
也许您查看了以下详细信息:
http://www.mybatis.org/mybatis-3/logging.html
希望有用!
可以参考mybatis logging
MyBatis 通过使用内部日志工厂提供日志信息。内部日志工厂会将日志信息委托给以下日志实现之一:
SLF4J
Apache Commons 日志记录
Log4j 2
日志4j
JDK 记录
选择的日志解决方案基于内部 MyBatis 日志工厂的运行时自省。 MyBatis 日志工厂将使用它找到的第一个日志记录实现(实现按上述顺序搜索)。如果 MyBatis 找到 none 以上实现,那么日志记录将被禁用。
许多环境将 Commons Logging 作为应用程序服务器 class 路径的一部分提供(很好的例子包括 Tomcat 和 WebSphere)。重要的是要知道在这样的环境中,MyBatis 将使用 Commons Logging 作为日志记录的实现。在像 WebSphere 这样的环境中,这意味着您的 Log4J 配置将被忽略,因为 WebSphere 提供了自己专有的 Commons Logging 实现。这可能会非常令人沮丧,因为 MyBatis 似乎忽略了您的 Log4J 配置(实际上,MyBatis 忽略了您的 Log4J 配置,因为 MyBatis 将在此类环境中使用 Commons Logging)。如果您的应用程序 运行 在 Commons Logging 包含在 class 路径中的环境中,但您更愿意使用其他日志记录实现之一,您可以 select 通过添加一个不同的日志记录实现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
并获取一个字符串作为构造函数参数。
您也可以select通过调用以下方法之一实现:
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 方法之前这样做。此外,如果该实现在运行时 classpath 上可用,这些方法将仅切换到请求的日志实现。例如,如果您尝试 select 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 日志语句,您可以在包、映射器完全限定的 class 名称、命名空间或完全限定的语句名称上启用日志记录。
同样,如何执行此操作取决于所使用的日志记录实现。我们将展示如何使用 Log4J 来完成它。配置日志服务只是简单地包含一个或多个额外的配置文件(例如 log4j.properties),有时还包括一个新的 JAR 文件(例如 log4j.jar)。以下示例配置将使用 Log4J 作为提供程序来配置完整的日志记录服务。有2个步骤。
第 1 步:添加 Log4J JAR 文件
因为我们使用的是 Log4J,所以我们需要确保其 JAR 文件对我们的应用程序可用。要使用 Log4J,您需要将 JAR 文件添加到您的应用程序 classpath。您可以从上面的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 的文件,如下所示,并将其放在您的 class 路径中:
# 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 的详细日志记录,而仅报告应用程序其余 class 的错误。
如果您想在更精细的级别调整日志记录,您可以为特定语句而不是整个映射器文件打开日志记录。以下行将为 selectBlog 语句启用日志记录:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
相反,您可能希望为一组映射器启用日志记录。在这种情况下,您应该将映射器所在的根包添加为记录器:
log4j.logger.org.mybatis.example=TRACE
有些查询可以 return 巨大的结果集。在这种情况下,您可能希望看到 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文件中的剩余配置用于配置appender,这超出了本文档的范围。但是,您可以在 Log4J 网站(上面的URL)找到更多信息。或者,您可以简单地对其进行试验,看看不同的配置选项有什么影响。
我用的是Spring4和MyBatis 3,想配置log4j打印sql日志如connection,select,insert,update,delete,statement,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)。谁能帮我?非常感谢!
也许您查看了以下详细信息: http://www.mybatis.org/mybatis-3/logging.html 希望有用!
可以参考mybatis logging
MyBatis 通过使用内部日志工厂提供日志信息。内部日志工厂会将日志信息委托给以下日志实现之一:
SLF4J Apache Commons 日志记录 Log4j 2 日志4j JDK 记录 选择的日志解决方案基于内部 MyBatis 日志工厂的运行时自省。 MyBatis 日志工厂将使用它找到的第一个日志记录实现(实现按上述顺序搜索)。如果 MyBatis 找到 none 以上实现,那么日志记录将被禁用。
许多环境将 Commons Logging 作为应用程序服务器 class 路径的一部分提供(很好的例子包括 Tomcat 和 WebSphere)。重要的是要知道在这样的环境中,MyBatis 将使用 Commons Logging 作为日志记录的实现。在像 WebSphere 这样的环境中,这意味着您的 Log4J 配置将被忽略,因为 WebSphere 提供了自己专有的 Commons Logging 实现。这可能会非常令人沮丧,因为 MyBatis 似乎忽略了您的 Log4J 配置(实际上,MyBatis 忽略了您的 Log4J 配置,因为 MyBatis 将在此类环境中使用 Commons Logging)。如果您的应用程序 运行 在 Commons Logging 包含在 class 路径中的环境中,但您更愿意使用其他日志记录实现之一,您可以 select 通过添加一个不同的日志记录实现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
并获取一个字符串作为构造函数参数。
您也可以select通过调用以下方法之一实现:
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 方法之前这样做。此外,如果该实现在运行时 classpath 上可用,这些方法将仅切换到请求的日志实现。例如,如果您尝试 select 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 日志语句,您可以在包、映射器完全限定的 class 名称、命名空间或完全限定的语句名称上启用日志记录。
同样,如何执行此操作取决于所使用的日志记录实现。我们将展示如何使用 Log4J 来完成它。配置日志服务只是简单地包含一个或多个额外的配置文件(例如 log4j.properties),有时还包括一个新的 JAR 文件(例如 log4j.jar)。以下示例配置将使用 Log4J 作为提供程序来配置完整的日志记录服务。有2个步骤。
第 1 步:添加 Log4J JAR 文件
因为我们使用的是 Log4J,所以我们需要确保其 JAR 文件对我们的应用程序可用。要使用 Log4J,您需要将 JAR 文件添加到您的应用程序 classpath。您可以从上面的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 的文件,如下所示,并将其放在您的 class 路径中:
# 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 的详细日志记录,而仅报告应用程序其余 class 的错误。
如果您想在更精细的级别调整日志记录,您可以为特定语句而不是整个映射器文件打开日志记录。以下行将为 selectBlog 语句启用日志记录:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
相反,您可能希望为一组映射器启用日志记录。在这种情况下,您应该将映射器所在的根包添加为记录器:
log4j.logger.org.mybatis.example=TRACE
有些查询可以 return 巨大的结果集。在这种情况下,您可能希望看到 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文件中的剩余配置用于配置appender,这超出了本文档的范围。但是,您可以在 Log4J 网站(上面的URL)找到更多信息。或者,您可以简单地对其进行试验,看看不同的配置选项有什么影响。