Springboot logback JPA打印sql参数

timo-nbktp 1年前 ⋅ 969 阅读

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的日志服务类
 *
 */
@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,格式化信息等,可以百度一下,有很多介绍,这里不展开了。

 

--end--

 

版权 本着开源共享、共同学习的精神,本文转载自 https://blog.csdn.net/z2926781/article/details/122661157 , 如果侵权之处,请联系博主进行删除,谢谢~