繁体   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