关于mybatis无法输出sql语句的问题

时间:2025-04-27 14:35:43

最近有人在论坛发帖说mybatis使用log4j无法打印sql语句,研究了,给出以下解决方案。


在mybatis的配置文件内加入如下设置:

<configuration>
<settings><setting name="logImpl" value="LOG4J"/></settings>

……
</configuration> 

告诉mybatis用log4j日志输出。


建立一个文件,内容如下:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "">

<log4j:configuration xmlns:log4j="/log4j/">



	<appender name="appender" class=".">
		<param name="File" value="D:/logs/" />
		<param name="Append" value="true" />
		<param name="threshold" value="DEBUG" />
		<param name="DatePattern" value="'.'yyyy-MM-dd'.txt'" />
		<layout class=".">
			<param name="ConversionPattern" value="[xxoo] %p [%t] %c{1}.%M(%L) | %m%n" />
		</layout>
	</appender>
	<logger name="" additivity="true">

		<level value="debug" />

	</logger>

	<logger name="" additivity="true">

		<level value="debug" />

	</logger>

	<logger name="" additivity="true">

		<level value="debug" />

	</logger>

	<logger name="" additivity="true">

		<level value="debug" />

	</logger>

	<logger name="" additivity="true">

		<level value="debug" />

	</logger>

	<root>
		<priority value="debug" />
		<appender-ref ref="appender" />
	</root>
</log4j:configuration>



注意root级别改为debug。


如果你去看mybatis源码,你会发现,mybatis的logfactory如下:


public final class LogFactory
{
  public static final String MARKER = "MYBATIS";
  private static Constructor<? extends Log> logConstructor;

  public static Log getLog(Class<?> aClass)
  {
    return getLog(());
  }

  public static Log getLog(String logger) {
    try {
      return (Log)(new Object[] { logger }); } catch (Throwable t) {
    }
    throw new LogException("Error creating logger for logger " + logger + ".  Cause: " + t, t);
  }

  public static synchronized void useCustomLogging(Class<? extends Log> clazz)
  {
    setImplementation(clazz);
  }

  public static synchronized void useSlf4jLogging() {
    setImplementation();
  }

  public static synchronized void useCommonsLogging() {
    setImplementation();
  }

  public static synchronized void useLog4JLogging() {
    setImplementation();
  }

  public static synchronized void useJdkLogging() {
    setImplementation();
  }

  public static synchronized void useStdOutLogging() {
    setImplementation();
  }

  public static synchronized void useNoLogging() {
    setImplementation();
  }

  private static void tryImplementation(Runnable runnable) {
    if (logConstructor == null)
      try {
        ();
      }
      catch (Throwable t)
      {
      }
  }

  private static void setImplementation(Class<? extends Log> implClass) {
    try {
      Constructor candidate = (new Class[] {  });
      Log log = (Log)(new Object[] { () });
      ("Logging initialized using '" + implClass + "' adapter.");
      logConstructor = candidate;
    } catch (Throwable t) {
      throw new LogException("Error setting Log implementation.  Cause: " + t, t);
    }
  }

  static
  {
    tryImplementation(new Runnable() {
      public void run() {
        LogFactory.useSlf4jLogging();
      }
    });
    tryImplementation(new Runnable() {
      public void run() {
        ();
      }
    });
    tryImplementation(new Runnable() {
      public void run() {
        LogFactory.useLog4JLogging();
      }
    });
    tryImplementation(new Runnable() {
      public void run() {
        ();
      }
    });
    tryImplementation(new Runnable() {
      public void run() {
        ();
      }
    });
  }
}


它支持各种日志,但是你要开启。