目前,比较流行的Log Framework 有:Apache Commons Logging,Avalon LogKit,log4j,SLF4J 等,ObjectiveSQL 没法肯定应用系统使用哪种 Log Framework,因此提供了扩展接口,由应用系统根据自身的须要进行实现,以Slf4j 为示例,详细介绍应用系统如何扩展实现Log Framework。java
ObjectiveSQL 中的扩展接口Logger.java 和LoggerFactory.java 以下:git
public interface Logger { void debug(long elapsedTime, String sql, Object[] params); void info(long elapsedTime, String sql, Object[] params); void error(String message, Throwable throwable); }
public interface LoggerFactory { Logger create(Class<?> clazz); }
结合SpringBoot 示例以下:github
import com.github.braisdom.objsql.Logger; import com.github.braisdom.objsql.LoggerFactory; import com.github.braisdom.objsql.util.StringUtil; import java.util.Arrays; public class ObjLoggerFactoryImpl implements LoggerFactory { private class ObjLoggerImpl implements Logger { private final org.slf4j.Logger logger; public ObjLoggerImpl(org.slf4j.Logger logger) { this.logger = logger; } @Override public void debug(long elapsedTime, String sql, Object[] params) { logger.debug(createLogContent(elapsedTime, sql, params)); } @Override public void info(long elapsedTime, String sql, Object[] params) { logger.info(createLogContent(elapsedTime, sql, params)); } @Override public void error(String message, Throwable throwable) { logger.error(message, throwable); } private String createLogContent(long elapsedTime, String sql, Object[] params) { String[] paramStrings = Arrays.stream(params).map(param -> String.valueOf(param)).toArray(String[]::new); String paramString = String.join(",", paramStrings); return String.format("[%dms] %s, with: [%s]", elapsedTime, sql, String.join(",", paramString.length() > 100 ? StringUtil.truncate(paramString, 99) : paramString)); } } @Override public Logger create(Class<?> clazz) { org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(clazz); return new ObjLoggerImpl(logger); } }
LoggerFactory loggerFactory = new ObjLoggerFactoryImpl(); Databases.installLoggerFactory(loggerFactory);
其实,原理很简单,只须要按要求实现Logger 和LoggerFactory 两个接口,在接口中注入自身Log Framework 的实现便可,示例中是以Slf4j 为示例,其它类型的Framework 也相似。完成具体实现后,须要将实例注入ObjectiveSQL。spring