快捷搜索: 王者荣耀 脱发

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,格式化信息等,可以百度一下,有很多介绍,这里不展开了。


经验分享 程序员 微信小程序 职场和发展