Mybatis源码阅读7 --- 适配你的日志

Mybatis通过定义Log接口和LogFactory实现对不同日志框架的适配,如log4j。LogFactory在静态代码块中首先尝试使用SL4J,用户也可通过设置"logImpl"指定自定义日志实现。启用log4j需要相应配置文件和依赖。Mybatis通过代理Connection、PreparedStatement等来实现SQL日志打印,从MappedStatement构建到执行全过程记录SQL信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java日志有很多,log4j,log4j2,comons-logging等,mybatis为不同日志提供了适配,how?

1、定义接口Log,日志框架需对应的实现,如log4j的实现类Log4jImpl

2、定义LogFactory作为获取日志的入口

LogFactory静态代码块会初始化一个可用的Log实现类:


还有一个静态方法userCustomLogging

public static synchronized void useCustomLogging(Class<? extends Log> clazz) {
  setImplementation(clazz);
}

来使用自定义的日志框架,how?

Class<? extends Log> logImpl = (Class<? extends Log>)resolveClass(props.getProperty("logImpl"));
configuration.setLogImpl(logImpl);

就是在setting中定义的:<setting name="logImpl" value="log4j" />

其实上面的setting也可以不配置的,注意LogFactory的静态代码块,先去使用了SL4J,Log4j可以作为其实现的,

要使用Log4j,配置文件来一发:

#配置根Logger 后面是若干个Appender
log4j.rootLogger=DEBUG,stdout

# ConsoleAppender 输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

当然pom中的依赖(sl4j, sl4j-log4j,log4j)是需要的,OK,debug,sql语句,参数,缓存命中率都有了


啥,sql日志就有了?你并没做这个功能,无需怀疑,肯定是框架做的,看看mybatis如何打印sql?代理Connection,PrepareStatement,下面截图看从头到尾的流程:

1、构建MappedStatement时生产log对象:


2、getConnection,返回Connection的代理:


3、如果调用的是prepareStatement,Connection代理的InvocationHandler打印日志,并生成PrepareStatement代理类,

PrepareStatementLogger、ResultSetLogger和ConnectionLogger相似:


MappedStatement的statementLog构建传入了id(id就是namespace,如

com.hhg.jerry.dao.CityDao)顺带提下log4j的功能,若不想输出(CityMapper.xml)相关的sql这样配置下就ok了:
mybatis的日志就这么多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值