mybatis配置log4j不输出日志问题

原因:Mybatis默认使用slf4j输出日志,需要增加slf4j对log4j的驱动jar包。


分析
请自行看下mybatis “ org.apache.ibatis.logging.LogFactory ”类源码,为了使读者更直观了解原因,笔者摘了LogFactory 部分代码。
 
   
public final class LogFactory {

  /**
   * Marker to be used by logging implementations that support markers
   */
  public static final String MARKER = "MYBATIS";

  private static Constructor 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就不会输出日志

你可能感兴趣的:(web开发)