From 182c30112e5bb0ca1e228fd15cc4f80173f983ae Mon Sep 17 00:00:00 2001 From: BlackR <413626226@qq.com> Date: Mon, 16 May 2022 19:11:07 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=87=E9=9D=A2=E6=94=AF=E6=8C=81=E8=A7=A3?= =?UTF-8?q?=E6=9E=90SPEL=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pigx/common/log/aspect/SysLogAspect.java | 13 +++++- .../pigx/common/log/util/SysLogUtils.java | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java index 4756657ed..78dcec15a 100644 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java @@ -19,6 +19,7 @@ package com.pig4cloud.pigx.common.log.aspect; +import cn.hutool.core.util.StrUtil; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; import com.pig4cloud.pigx.common.core.util.KeyStrResolver; import com.pig4cloud.pigx.common.log.annotation.SysLog; @@ -31,7 +32,9 @@ import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.expression.EvaluationContext; /** * 操作日志使用spring event异步入库 @@ -54,8 +57,16 @@ public class SysLogAspect { String strMethodName = point.getSignature().getName(); log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName); + String value = sysLog.value(); + if (StrUtil.isNotBlank(value)) { + // 解析SPEL + MethodSignature signature = (MethodSignature) point.getSignature(); + EvaluationContext context = SysLogUtils.getContext(point.getArgs(), signature.getMethod()); + value = SysLogUtils.getValue(context, value, String.class); + } + SysLogDTO logDTO = SysLogUtils.getSysLog(); - logDTO.setTitle(sysLog.value()); + logDTO.setTitle(value); // 发送异步日志事件 Long startTime = System.currentTimeMillis(); Object obj; diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java index c44af2f10..1c061cc14 100644 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -24,6 +24,11 @@ import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpUtil; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; import lombok.experimental.UtilityClass; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.provider.OAuth2Authentication; @@ -31,6 +36,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; import java.util.Objects; /** @@ -94,4 +100,39 @@ public class SysLogUtils { return authentication.getName(); } + + + /** + * 获取spel 定义的参数值 + * + * @param context 参数容器 + * @param key key + * @param clazz 需要返回的类型 + * @param 返回泛型 + * @return 参数值 + */ + public T getValue(EvaluationContext context, String key, Class clazz) { + SpelExpressionParser spelExpressionParser = new SpelExpressionParser(); + Expression expression = spelExpressionParser.parseExpression(key); + return expression.getValue(context, clazz); + } + + /** + * 获取参数容器 + * + * @param arguments 方法的参数列表 + * @param signatureMethod 被执行的方法体 + * @return 装载参数的容器 + */ + public EvaluationContext getContext(Object[] arguments, Method signatureMethod) { + String[] parameterNames = new LocalVariableTableParameterNameDiscoverer().getParameterNames(signatureMethod); + EvaluationContext context = new StandardEvaluationContext(); + if (parameterNames == null) { + return context; + } + for (int i = 0; i < arguments.length; i++) { + context.setVariable(parameterNames[i], arguments[i]); + } + return context; + } }