如上图,一般我们打印的日志都是参数都是问号,看起来不够直观,这时候可以考虑用P6SPY。
引入依赖:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency>
替换JDBC驱动,并在数据源配置Url中添加p6spy:
格式化输出配置:
import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import org.apache.commons.lang3.StringUtils; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * SQL格式化输出 */ public class P6spySqlFormatConfigure implements MessageFormattingStrategy { /** * sql格式化输出 */ @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { return StringUtils.isNotBlank(sql) ? formatFullTime(LocalDateTime.now(), DateUtil.FULL_TIME_SPLIT_PATTERN) + " | 耗时 " + elapsed + " ms | SQL 语句:" + StringUtils.LF + sql.replaceAll("[\\s]+", StringUtils.SPACE) + ";" : StringUtils.EMPTY; } /** * 日期格式化 */ public String formatFullTime(LocalDateTime localDateTime, String pattern) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return localDateTime.format(dateTimeFormatter); } }
用到的时间工具类:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Locale; /** * 时间工具类 */ public class DateUtil { public static final String FULL_TIME_PATTERN = "yyyyMMddHHmmss"; public static final String FULL_TIME_SPLIT_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static final String CST_TIME_PATTERN = "EEE MMM dd HH:mm:ss zzz yyyy"; public static String formatFullTime(LocalDateTime localDateTime) { return formatFullTime(localDateTime, FULL_TIME_PATTERN); } public static String formatFullTime(LocalDateTime localDateTime, String pattern) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return localDateTime.format(dateTimeFormatter); } public static String getDateFormat(Date date, String dateFormatType) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormatType, Locale.CHINA); return simpleDateFormat.format(date); } public static String formatCstTime(String date, String format) throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(CST_TIME_PATTERN, Locale.US); Date usDate = simpleDateFormat.parse(date); return DateUtil.getDateFormat(usDate, format); } public static String formatInstant(Instant instant, String format) { LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); return localDateTime.format(DateTimeFormatter.ofPattern(format)); } }
sys.properties配置文件:
# 使用日志系统记录 sql appender=com.p6spy.engine.spy.appender.Slf4JLogger # 自定义日志打印 logMessageFormat=com.study.p6spy.P6spySqlFormatConfigure ## 配置记录Log例外 excludecategories=info,debug,result,batc,resultset # 设置使用p6spy driver来做代理 deregisterdrivers=true # 是否开启慢 SQL记录 outagedetection=true # 慢 SQL记录标准 2 秒 outagedetectioninterval=2 # 开启过滤 filter=true # 包含 QRTZ的不打印 #exclude=QRTZ,select 1
控制台日志如下: