测试环境:MyBatis3.2.7+logBack1.1.3
1. 在MyBatis的配置文件中增加setting配置
注意:dao.中的字符“.”是必须的
<settings>
<setting name="logPrefix" value="dao."/>
</settings>
2.在logBack的配置文件中增加logger配置
<logger name="dao" level="DEBUG">
<!--daoFILE为实际定义的appender-->
<appender-ref ref="daoFILE" />
</logger>
3.源码解析
ConnectionLogger
public Object invoke(Object proxy, Method method, Object[] params)
throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, params);
}
if ("prepareStatement".equals(method.getName())) {
if (isDebugEnabled()) {
debug(" Preparing: " + removeBreakingWhitespace((String) params[0]), true);
}
PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params);
stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack);
return stmt;
}
其中的isDebugEnabled()指的是
protected boolean isDebugEnabled() {
return statementLog.isDebugEnabled();
}
注意这里的statementLog,看SimpleExecutor的prepareStatement(handler, ms.getStatementLog());
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
Statement stmt = null;
try {
Configuration configuration = ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
stmt = prepareStatement(handler, ms.getStatementLog());
return handler.<E>query(stmt, resultHandler);
} finally {
closeStatement(stmt);
}
}
这个statementLog是ms.getStatementLog()而来的。而MappedStatement的StatementLog
String logId = id;
if (configuration.getLogPrefix() != null) logId = configuration.getLogPrefix() + id;
mappedStatement.statementLog = LogFactory.getLog(logId);
这里可以看到,logPrefix决定了所有log前缀,所以只需要配置logPrefix就行了
参考资料:
1. myBatis3.2.7如何打印sql http://www.cnblogs.com/beiyeren/p/4196134.html