mybatis配置log4j不输出日志问题

来源:互联网 发布:java方法的定义和调用 编辑:程序博客网 时间:2024/05/16 04:26
原因: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"

3、使用“LogFactory.getLog”方法输出日志,如下实例代码。这时候使用是slf4j输出日志。
调用顺序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就不会输出日志
0 0
原创粉丝点击