目前,比拟风行的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。