目前,比较流行的Log Framework 有:Apache Commons Logging,Avalon LogKit,log4j,SLF4J 等,ObjectiveSQL 无法确定应用系统使用哪一种 Log Framework,所以提供了扩展接口,由应用系统根据自身的需要进行实现,以Slf4j 为示例,详细介绍应用系统如何扩展实现Log Framework。
ObjectiveSQL 中的扩展接口Logger.java 和LoggerFactory.java 如下:
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 示例如下:
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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。