最近有人在论坛发帖说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>
如果你去看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() {
();
}
});
}
}
它支持各种日志,但是你要开启。