Mybatis日志信息
2014-10-30 00:00
507 查看
摘要: Log4j无法打印MyBatis Sql日志信息
问题:开发组说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
问题:开发组说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
相关文章推荐
- SSM框架day02-MyBatis——011第一个程序-显示日志信息、012-定义和使用工具类、013从属性文件读取DB连接四要素
- 使用log4j打印日志信息的操作----以在MyBatis中使用为例
- 在mybatis中log4j日志信息不能输出到控制台
- 给日志信息加色
- 集中管理日志信息--例cron日志
- 用Python的高阶函数写日志,并且捕获异常信息
- 关于websphere v6的采用log4j输出日志信息的问题
- 安装sql server 2000时又出现:安装程序配置服务器失败。参考服务器错误日志和 C:/WINNT/sqlstp.log 了解更多信息。
- mysql优化(1)show命令 慢查询日志 explain profiling(查看CPU、DISK I\O等信息)
- Java获取Redis的日志信息和动态监控信息
- android 解决华为系列手机调试时不能打印Logcat日志信息
- Spring mybatis源码篇章-NodeHandler实现类具体解析保存Dynamic sql节点信息
- log4j layout日志信息格式
- Db2查看未提交的事务开始时间、占用日志空间大小、应用IP地址、执行的SQL语句等信息
- 日志框架只打印出Mybatis SQL的配置
- mybatis日志
- hadoop webUI上不能查看log日志输出信息
- Linux下如何启动Tomcat像Windows启动并显示控制台日志信息一样?
- Mybatis 输出sql信息
- Mist钱包 无法连接节点,查看日志获取更多信息