Springboot logback JPA打印sql参数
1、配置方式:
springboot + logback + jpa,打印sql(格式化),打印参数方式如下:
在application.yml中,追加配置
spring: jpa: show-sql: true properties: hibernate: format_sql: true logging: level: org.hibernate.SQL: debug org.hibernate.type.descriptor.sql.BasicBinder: trace
打印sql效果:
绑定参数:
以上,即通过设置配置文件方式 调整hibernate打印日志级别 解决,方法简单,但有弊端
弊端:
简单来说就是不灵活,不方便,想象一下,生产系统多数使用elk等日志平台收集日志,参数如果打印多行,势必给查找带来不便,也会增大日志空间使用,我们希望的是 让他能打到一条日志里,这样更直观,所以可以采用下面的方式。
2、切面方式:
我们知道spring有强大的切面功能,可以在Repository类中统一追加切入点,来追加特定日志,代码如下:
/** * 用于JPA的日志服务类 * * @author zetor */ @Aspect @Component public class JpaLogAspect { private static final Logger log = LoggerFactory.getLogger(JpaLogAspect.class); @Pointcut("execution(* com.ym.ms..*Repository.*(..))") public void getPointcut() { // do something in Around } @Around("getPointcut()") public Object logAround(ProceedingJoinPoint point) throws Throwable { if (!log.isDebugEnabled()) { return point.proceed(); } long beginTime = System.currentTimeMillis(); Object result = point.proceed(); long time = System.currentTimeMillis() - beginTime; printLog(point, time); return result; } private void printLog(ProceedingJoinPoint joinPoint, long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //请求的 类名、方法名 String clazz = signature.getDeclaringTypeName(); String method = joinPoint.getSignature().getName(); //请求的参数 Object[] args = joinPoint.getArgs(); log.debug("JPA_LOG - class:{}, method:{}, param:{}, costTime:{}", clazz, method, JSON.toJSONString(args), time); } }
当然了,这里使用debug级别的日志,你应该知道,还需要一步
在application.yml设置这个打印级别
logging: level: root: info org.hibernate.SQL: debug com.yourpath.JpaLogAspect: debug
打印效果:
包括类名、方法名、参数、耗时相关信息 显示
kibana效果:
注:另外关于logback的配置,如推送至kibana,格式化信息等,可以百度一下,有很多介绍,这里不展开了。
下一篇:
Oracle数据库的使用(学习)