前天我上传了我的MyBatis系列课程(http://edu.51cto.com/course/course_id-1110.html)的第六讲,主要内容是如何使用Log4j2(具体版本为v2.0-rc1)为MyBatis 3.2.7配置日志。实际上目前最新的版本是刚刚发布的v2.0-rc2,我也尝试过在MyBatis 3.2.7中使用它,但却报出以下错误:
java.lang.ClassNotFoundException: org.apache.logging.log4j.spi.AbstractLoggerWrapper。
用好压打开文件log4j-api-2.0-rc2.jar查看,果然没有类AbstractLoggerWrapper。遂到其官方网站报告了此问题(https://issues.apache.org/jira/browse/LOG4J2#selectedTab=com.atlassian.jira.jira-projects-plugin:issues-panel),问题编号LOG4J2-700。不久有人回复我,AbstractLoggerWrapper在rc2中已改名为ExtendedLoggerWrapper。用好压打开log4j-api-2.0-rc2.jar,可以看到类ExtendedLoggerWrapper(所在的包不变)。
接着,在他的提示下,通过查阅MyBatis和Log4j2的官方文档(MyBatis:http://mybatis.github.io/mybatis-3/logging.html,Log4j2:http://logging.apache.org/log4j/2.x/faq.html),我找到了一种可以在MyBatis 3.2.7下使用Log4j2 rc2的方法,原理是指定MyBatis 3.2.7调用SLF4J的API,但通过SLF4J Binding,把具体的日志调用导向Log4j2,如下图红框所示:
(图片来源:http://logging.apache.org/log4j/2.x/faq.html)
具体步骤如下:
1、在MyBatis的主配置文件中指定使用SLF4J,即在settings元素中添加如下配置:
<setting name="logImpl" value="SLF4J"/>
2、在SLF4J的官方网站(http://www.slf4j.org)下载slf4j-1.7.7,把其中的slf4j-api-1.7.7.jar添加到工程中;
3、把Log4j2 rc2提供的log4j-slf4j-impl-2.0-rc2.jar文件添加到工程中。
当然,要想使用Log4j2 rc2的话,log4j-api-2.0-rc2.jar和log4j-core-2.0-rc2.jar这两个文件是必须要添加到工程中的。
此外,根据上图介绍,也可以用类似的方法,先指定MyBatis 3.2.7使用Commons Logging API,然后通过Commons Logging Bridge,把最终的日志调用导向Log4j2,如下图红框所示:
(图片来源:http://logging.apache.org/log4j/2.x/faq.html)
具体步骤如下:
1、在MyBatis的主配置文件中指定使用Commons Logging,即把如上的setting配置修改如下:
<setting name="logImpl" value="COMMONS_LOGGING"/>
2、工程中本身就有commons-logging-1.1.1.jar文件;
3、把Log4j2 rc2提供的Commons Logging Bridge,即log4j-jcl-2.0-rc2.jar添加到工程中。
回到上文帮助我的那个人,他又到MyBatis issue tracker上提交了此问题(编号235):https://github.com/mybatis/mybatis-3/issues/235。如你所见,此问题在他之前已被提出(问题编号刚好是234),并被解决。解决的方法在这里:https://github.com/mybatis/mybatis-3/commit/28c6f04f63e7fdb6eb7a0ffaf789dc4c157e10c0。
上上官网还是有好处的哦。
(相关链接:MyBatis日志之Log4j 1.2示例)
猛戳这里全面系统地学习MyBatis 3
MyBatis技术交流群:188972810,或扫描二维码:
点击此处观看作者的MyBatis 3从入门到提高视频教程
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之预备篇二:ant入门示例
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例
【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)