mybatis配置log4j不输出日志问题

Mybatis默认使用slf4j进行日志输出,为使其使用log4j,需要添加slf4j对log4j的驱动jar包。初始化过程中,按特定顺序尝试使用不同日志系统,一旦找到合适的就停止尝试。若缺少slf4j-log4j12的驱动,将不会通过log4j输出日志。解决方案是引入相应驱动jar。

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

原因: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就不会输出日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值