Mybatis的Log4j⽇志输出问题-以及有关⽇志的所有问题使⽤Mybatis的时候,有些时候能输出(主要是指sql,参数,结果)⽇志。有些时候就不能。
⽆法输出⽇志的时候,⽆论怎么配置log4j,不管是properties的还是xml的,都不起作⽤。
有些时候,我们没做什么配置就能输出⽇志....
这是⼀个让⽆数⼈烦躁的问题。其实解决问题很容易(我过了这么久才解决,以前都⽤输出)。
这是⼀个普⼤喜奔的⽇⼦,让我们⼀起来看看如何解决mybatis的⽇志问题。
为什么说这个问题很容易解决呢?因为mybatis的⽂档写的很清楚。
为什么我们都没到解决办法呢?因为即使看过⽂档的⼈,也未必去看Logging这⼀节。但是这⼀节正是解决问题的关键。
已经等不及的⼩伙伴们可以直接去这⾥看⽂档:
提醒最常⽤的⽅法不再这个链接中,但是这个⽂档提供了对log4j的详细配置。本⽂下⾯的内容⼤部分是这个⽂档的Copy。
Mybatis内置的⽇志⼯⼚提供⽇志功能,具体的⽇志实现有以下⼏种⽅式:
SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging
具体选择哪个⽇志实现由MyBatis的内置⽇志⼯⼚确定。它会使⽤最先到的(按上⽂列举的顺序查)。如果⼀个都未到,⽇志功能就会被禁⽤。
不少应⽤服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere,所以MyBatis会把它作为具体的⽇志实现。
记住这点⾮常重要。这意味着,在诸如 WebSphere的环境中——WebSphere提供了Commons Logging的私有实现,你的Log4J配置将被忽略。
这种做法不免让⼈悲摧,MyBatis怎么能忽略你的配置呢?事实上,因Commons Logging已经存在,按优先级Log4J⾃然就被忽略了!
不过,如果你的应⽤部署在⼀个包含Commons Logging的环境,⽽你⼜想⽤其他的⽇志框架,你可以根据需要调⽤如下的某⼀⽅法:
org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();
如果的确需要调⽤以上的某个⽅法,请在调⽤所有其他MyBatis⽅法前调⽤它。另外,只有在相应⽇志实现存在的前提下,调⽤对应的⽅法才是有意义的,否则MyBatis⼀概忽略。如你环境中并不存在Log4J,你却调⽤了相应的⽅法,MyBatis就会忽略这⼀调⽤,代之默认的查顺序查⽇志实现。
例如使⽤log4j就需要在调⽤mybatis⽅法前,先执⾏代码:
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
上⾯这是⼀种解决办法,但是有些情况你不知道何时执⾏这个⽅法。
mybatis还提供了另外⼀种(推荐使⽤这种)解决⽅法,继续看下⾯。
另⼀种解决为,在l配置⽂件中:
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
这⾥只写了关键的⼀部分配置信息,在你⾃⼰配置的基础上增加<setting name="logImpl" value="LOG4J"/>即可。这样⼀来log4j的配置信息就会起作⽤。
参数说明:
Mybatis对Log4j的配置⽀持:
Logging Configuration
MyBatis可以对包、类、命名空间和全限定的语句记录⽇志。
具体怎么做,视使⽤的⽇志框架⽽定,这⾥以Log4J为例。配置⽇志功能⾮常简单:添加⼏个配置⽂件,如log4j.properties,再增加个jar包,如log4j.jar。下⾯是具体的例⼦,共两个步骤:
步骤1:增加Log4J jar包
因为采⽤Log4J,要确保在应⽤中对应的jar包是可⽤的。要满⾜这⼀点,只要将jar包添加到应⽤的classpath中即可。 Log4J的jar包可以从上⽅的链接下载。
具体⽽⾔,对于web或企业应⽤,需要将log4j.jar 添加到WEB-INF/lib ⽬录;对于独⽴应⽤,可以将它添加到jvm的-classpath启动参数中。log4j与log4j2
步骤2:配置Log4J
配置Log4J⽐较简单,⽐如需要记录这个mapper接⼝的⽇志:
ample;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
只要在应⽤的classpath中创建⼀个名称为log4j.properties的⽂件,⽂件的具体内容如下:
# Global logging configuration
# MyBatis
ample.BlogMapper=TRACE
#
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就会把 ample.BlogMapper 的详细执⾏⽇志记录下来,对于应⽤中的其它类则仅仅记录错误信息。
也可以将⽇志从整个mapper接⼝级别调整到到语句级别,从⽽实现更细粒度的控制。如下配置只记录 selectBlog 语句的⽇志:
ample.BlogMapper.selectBlog=TRACE
与此相对,可以对⼀组mapper接⼝记录⽇志,只要对mapper接⼝所在的包开启⽇志功能即可:
ample=TRACE
某些查询可能会返回⼤量的数据,只想记录其执⾏的SQL语句该怎么办?为此,Mybatis中SQL语句的⽇志级别被设为
DEBUG(JDK Logging中为FINE),结果⽇志的级别为TRACE(JDK Logging中为FINER)。所以,只要将⽇志级别调整为DEBUG 即可达到⽬的:
ample=DEBUG
要记录⽇志的是类似下⾯的mapper⽂件⽽不是mapper接⼝⼜该怎么呢?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ample.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
对这个⽂件记录⽇志,只要对命名空间增加⽇志记录功能即可:
ample.BlogMapper=TRACE
进⼀步,要记录具体语句的⽇志可以这样做:
ample.BlogMapper.selectBlog=TRACE
看到了把,两种配置没差别!
配置⽂件log4j.properties的余下内容是针对⽇志格式的,这⼀内容已经超出本⽂档范围。关于Log4J的更多内容,可以参考Log4J的⽹站。不过,可以简单试⼀下看看,不同的配置会产⽣什么不⼀样的效果。
总结:TRACE会显⽰SQL与参数以及结果,debug只会显⽰SQL与参数,不显⽰结果。
附⼀个项⽬中⽤的log4j的配置:
am.mapper=DEBUG
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
log4j.appender.B=org.apache.log4j.RollingFileAppender
log4j.appender.B.File=G:\\exam.log
log4j.appender.B.MaxFileSize=10MB
log4j.appender.B.MaxBackupIndex=50
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
  上⾯红⾊字体是mybatis的配置,am.mapper是mapper的包名。如果只想看打出的SQL⽽不看查询的数据结果可以将TRACE改为DEBUG即可。
  A是将⽇志输出到控制台,B是输出到⽂件中
Log4j中将要输出的Log信息定义了5种级别:
  依次为DEBUG、INFO、WARN、ERROR和FATAL.
  并⽆trace级别,因此trace级别同debug级别,我们可以理解为在mybatis中TRACE与DEBUG统计,只是TRACE显⽰更全的SQL 信息(包括语句与结果集),⽽debug只显⽰sql

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。