mybatis测试中出现ERROR StatusLogger No log4j2 configuration file found.

首先附上官网的说明文档:
mybatis Logging

概述


在mybatis框架搭建完成用log4j2进行测试时,总是出现ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console错误。

经过各种方法后,终于找到一种有效管用的方法。首先介绍我的环境版本号:
log4j2的jar包版本号是mybatis3.4.5框架自带的log4j,如下所示:

这里写图片描述

环境spring4.3.0+springmvc4.3.0+mybatis3.4.5
按官方文档的说明

1 SLF4J
2 Apache Commons Logging
3  Log4j 2
4  Log4j
5 JDK logging

,mybatis会使用最先找到的(按上文列举的顺序查找),不少应用服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere, 所以MyBatis会把它作为具体的日志实现。所以我们首先得指定要使用哪个日志框架,因为是在ssm环境中配置,所以没有mybatis-config.xml文件,就不能在里面配置下面几行

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J"/>
    ...
  </settings>
</configuration>

那我们就得在web.xml文件中指定使用log4j作为我们的日志框架的实现。

 

独立运行的报错解决方案:

错误解决办法:右击工程名新建一个source folder, 命名为resources,下面建一个log4j.properties文件, 

你可以对包、映射类的全限定名、命名空间或全限定语句名开启日志功能来查看 MyBatis 的日志语句。

再次说明下,具体怎么做,由使用的日志工具决定,这里以 Log4J 为例。配置日志功能非常简单:添加一个或多个配置文件(如 log4j.properties),有时需要添加 jar 包(如 log4j.jar)。下面的例子将使用 Log4J 来配置完整的日志服务,共两个步骤:

步骤 1:添加 Log4J 的 jar 包

   因为我们使用的是 Log4J,就要确保它的 jar 包在应用中是可用的。要启用 Log4J,只要将 jar 包添加到应用的类路径中即可。Log4J 的 jar 包可以在上面的链接中下载。

   对于 web 应用或企业级应用,则需要将 log4j.jar 添加到 WEB-INF/lib 目录下;对于独立应用,可以将它添加到JVM 的 -classpath 启动参数中。

步骤 2:配置 Log4J

 配置 Log4J 比较简单,假如你需要记录这个映射器接口的日志:(下方org.mybatis.example.BlogMapper是你自己的包名)

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 语句而不想记录结果该怎么办?为此,Mybatis 中 SQL 语句的日志级别被设为DEBUG(JDK 日志设为 FINE),结果的日志级别为 TRACE(JDK 日志设为 FINER)。所以,只要将日志级别调整为 DEBUG 即可达到目的:

log4j.logger.org.mybatis.example=DEBUG

 要记录日志的是类似下面的映射器文件而不是映射器接口又该怎么做呢?

如需对 XML 文件记录日志,只要对命名空间增加日志记录功能即可:

log4j.logger.org.mybatis.example.BlogMapper=TRACE

要记录具体语句的日志可以这样做:

log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE

你应该注意到了,为映射器接口和 XML 文件添加日志功能的语句毫无差别。

注意 如果你使用的是 SLF4J 或 Log4j 2,MyBatis 将以 MYBATIS 这个值进行调用。

 

 

关于web中的log4j日志配置与xml配置问题:

那我们就得在web.xml文件中指定使用log4j作为我们的日志框架的实现。
web.xml中的配置如下

      <!-- 加载log4j配置文件 -->
    <context-param>
      <param-name>log4jConfigLocation</param-name>
      <param-value>classpath:log4j.properties</param-value>
      <!-- <param-value>/WEB-INF/log4j.xml</param-value> -->
    </context-param>
    <listener>
       <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

接着在编写log4j.propertes文件
log4j.properties

#定义LOG输出级别
log4j.rootLogger=INFO,Console,File

#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活的指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n

#mybatis显示SQL语句日志配置  
#log4j.logger.org.mybatis=DEBUG
log4j.logger.net.cxp.blog.dao=DEBUG


#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File=logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize=10MB
#输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm|\:ss}][%c]%m%n

其中和打印sql语句有关的是下面几句

#mybatis显示SQL语句日志配置  
#log4j.logger.org.mybatis=DEBUG
log4j.logger.net.cxp.blog.dao=DEBUG

照官方的配置,应该就写

log4j.logger.net.cxp.blog.dao=DEBUG

注:net.cxp.blog.dao是你的dao接口所在的包名
这行就行了,是不是很简单。。。。。可博主被这个简单的问题折腾了一个上午,百度了各种写法,又把properties文件换成xml文件,加了下面几句或类似写法的,比如log4j.logger.ibatis…等等

log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug 

除了打印一些数据库连接和事务提交的语句外,sql语句还是没有出来。但博主还是不死心,继续百度吧,靠谱的不不靠谱的都点开来看一下,后来看到知乎也有人提相关的问题–我怎么配置 java log4j在控制台打印不出mybaits 的sql语句 有谁能解决不?( baidu, google 中,搜到的方法都用过,都不能正常解决该问题 ),看到下面只有3个人回答,而且有两个的回答都是看过的。但还有:

log4j.logger.org.mybatis=DEBUG

这句没见过,加了这句,竟然成功了,之后注释掉这句,只写官方的写法,就是下面这句:

log4j.logger.net.cxp.blog.dao=DEBUG

引用一篇文章:https://blog.csdn.net/github_32658299/article/details/54288923