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--