原因:Mybatis默认使用slf4j输出日志,需要增加slf4j对log4j的驱动jar包。
分析
请自行看下mybatis “
org.apache.ibatis.logging.LogFactory ”类源码,为了使读者更直观了解原因,笔者摘了LogFactory 部分代码。
</pre><pre name="code" class="java">public final class LogFactory {
/**
* Marker to be used by logging implementations that support markers
*/
public static final String MARKER = "MYBATIS";
private static Constructor<? extends Log> logConstructor;
static {
tryImplementation(new Runnable() {
@Override
public void run() {
useSlf4jLogging();
}
});
tryImplementation(new Runnable() {
@Override
public void run() {
useCommonsLogging();
}
});
tryImplementation(new Runnable() {
@Override
public void run() {
useLog4J2Logging();
}
});
tryImplementation(new Runnable() {
@Override
public void run() {
useLog4JLogging();
}
});
tryImplementation(new Runnable() {
@Override
public void run() {
useJdkLogging();
}
});
tryImplementation(new Runnable() {
@Override
public void run() {
useNoLogging();
}
});
}
private LogFactory() {
// disable construction
}
public static Log getLog(Class<?> aClass) {
return getLog(aClass.getName());
}
public static Log getLog(String logger) {
try {
return logConstructor.newInstance(new Object[] { logger });
} catch (Throwable t) {
throw new LogException("Error creating logger for logger " + logger + ". Cause: " + t, t);
}
}......
"
tryImplementation
" 方法很关键
private static void tryImplementation(Runnable runnable) {
if (logConstructor == null) {
try {
runnable.run();
} catch (Throwable t) {
// ignore
}
}
}
分析步骤:
1、初始化日志组件, “
static”静态块被初始化,
加载各种主流风格的日志组件,如:logging\log4j\jdkloging等。
2、
在上段代码中,“logConstructor”被第一个“useSlf4jLogging”初始化,执行第二个"
useCommonsLogging"
,logConstructor !=null,不往下走, 所以使用slf4j输出日志。(如果工程没有
slf4j包,初始化会报错但不影响,异常被捕获吞掉了,会继续使用第二个默认日志输出,可以自己看代码
);
调用顺序“static”->“
tryImplementation"->"Runnable"->"useSlf4jLogging"->""setImplementation->"logConstructor"
调用顺序“getLog”->"
logConstructor.newInstance"
protected static final Log logger = LogFactory.getLog(MyBatisBatchItemWriter.class);
4、关键点。
log4j是一个日志系统。
slf4j是一个日志系统的封装,对外提供统一的API,如果我们选择log4j作为我们的日志实现,需要下载slf4j-log4j12-x.x.x.jar驱动,如果没有slf4j-log4j12-x.x.x.jar就不会输出日志。