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; + } }