问题:开发组说MyBatis的日志信息只能通过顶级日志记录器在debug下打印SQL,所以测试时一大堆的信息,弄得个单元测试,启动要老半天。
为了解决这样的问题,我看了下开发组的日志信息配置,代码如下:
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
问了下Google,全大部分都是上面这样配置的,我在想这样错误的配置,居然还被转载这么多次数,这个世界,用脑子在开发的人到底剩多少;在这里做一个简单的说明,详细的,可以到log4j的官网看看
这里讲两点log4j的基础知识
1、默认log4j的日志信息会被传播到父日志里面去的,比如:
org.abc.A1 打印信息:2014-10-30 xxxxxx
org.abc作为org.abc.A1的父日志,同样也会打印:2014-10-30 xxxxxx,如果想不被继承传播打印,可以使用additivity=false来禁止掉,也可以通过提高父日志记录器的日志级别
2、全大部分的开源或者说开发中,默认定义日志的方式是类似LoggerFactory.geLogger(XXX.class)方式,这样就意味着日志记录器的名称为类的全名称。
而在mybatis中,打印sql的日志命名是按照你指定那条sql所在xml的命名空间+点号+id(方法名)构成的,而一般的命名空间是你生成的Mapper类的全名称。
所以mybatis的日志记录器即不是org.apache.ibatis也不是java.sql,而是你自己定义的mapper名加上方法名,所以如果你想打印mybatis的运行时SQL信息,可以如下方式:
粗粒度控制 所有的命名空间相同的前缀作为日志记录器名 比如定义:
log4j.logger.com.xxx.mapper=DEBUG, stdout
细粒度控制 可以针对某个命名空间作为日志记录器名 比如定义:
log4j.logger.com.xxx.mapper.UserMapper=DEBUG, stdout
更细粒度控制 可以定义为命名空间加上id作为指定的某条sql的日志记录器 比如定义:
log4j.logger.com.xxx.mapper.UserMapper.selectAll=DEBUG, stdout
写完这篇后,在mybatis的官网上面看到人家都已经简单说明啦,移步到http://mybatis.github.io/mybatis-3/zh/logging.html