在使用mybatis,有时候,我们会选择自己的日志类,那么针对mybatis日志选择,如果要使用我们自定义的。
1、实现org.apache.ibatis.logging.Log接口。
public class TestLog implements org.apache.ibatis.logging.Log {
public TestLog(){
System.out.println("wucan");
}
Logger logger = null;
public TestLog(String sring){
logger = Logger.getLogger(sring);
}
@Override
public boolean isDebugEnabled() {
return true;
}
@Override
public boolean isTraceEnabled() {
return false;
}
@Override
public void error(String s, Throwable e) {
logger.info("LuBan:trace:{}".concat(s));
}
@Override
public void error(String s) {
logger.info("LuBan:error".concat(s));
}
@Override
public void debug(String s) {
logger.info("LuBan:debug".concat(s));
}
@Override
public void trace(String s) {
logger.info("LuBan:trace".concat(s));
}
@Override
public void warn(String s) {
logger.info("LuBan:warn".concat(s));
}
}
第二步:在spring-mybatis整合时,我们要通过sqlSessionFactory来设置mybatis的日志选择
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
SqlSessionFactory sqlSessionFactory = annotationConfigApplicationContext.getBean("sqlSessionFactory", SqlSessionFactory.class);
sqlSessionFactory.getConfiguration().setLogImpl(TestLog.class);
}
通过拿到SessionFactoryFactory,然后拿到Configuration,里面包含了很多配置mybatis属性的东西。在set日志实现类。
注意:isDebugEnabled()和TestLog(String strin)方法,这两个很重要,当在选择打印Debug级别日志的时候,mybatis在打印debug的时候,会调用isDebugenabled方法判断是否开启了Debug日志。下面贴行mybatis源码中的一个打印debug日志的判断逻辑
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("SqlSession [" + session + "] was not registered for synchronization because synchronization is not active");
}
所以,如果要打印debug日志,就要把方法返回值改成true。
需要注意的第二个点是,有参的构造方法。在mybatis选择日志是。
private static void setImplementation(Class<? extends Log> implClass) {
try {
Constructor<? extends Log> candidate = implClass.getConstructor(String.class);
Log log = candidate.newInstance(LogFactory.class.getName());
if (log.isDebugEnabled()) {
log.debug("Logging initialized using '" + implClass + "' adapter.");
}
logConstructor = candidate;
} catch (Throwable t) {
throw new LogException("Error setting Log implementation. Cause: " + t, t);
}
}
会通过上面代码执行,在获取无参构造方式是,如果没有会报错,就无法执行下去了,最终导致日志设置失败。
通过自定义日志,我们可以随意选择日志体系,设置日志格式等等。