From 915e6191470c29085c67354f92ce3cb8a7f1dcc9 Mon Sep 17 00:00:00 2001 From: tjq Date: Sat, 6 Jun 2020 19:39:48 +0800 Subject: [PATCH] [fix] fix aop bug which will lead to online log function un reachable --- .../kfcfans/oms/server/web/WebLogAspect.java | 54 ++++++++++++++----- .../web/controller/InstanceController.java | 45 +++------------- .../server/web/response/InstanceInfoVO.java | 38 +++++++++++++ 3 files changed, 85 insertions(+), 52 deletions(-) diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/WebLogAspect.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/WebLogAspect.java index 05d5bf2f..f09cdbbf 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/WebLogAspect.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/WebLogAspect.java @@ -1,7 +1,9 @@ package com.github.kfcfans.oms.server.web; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -11,6 +13,8 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 使用AOP记录访问日志 @@ -46,20 +50,44 @@ public class WebLogAspect { @Before("webLog()") public void doBefore(JoinPoint joinPoint) { - // 获取请求域 - ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (requestAttributes == null) { - return; + try { + // 获取请求域 + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return; + } + HttpServletRequest request = requestAttributes.getRequest(); + + String[] classNameSplit = joinPoint.getSignature().getDeclaringTypeName().split("\\."); + String classNameMini = classNameSplit[classNameSplit.length - 1]; + String classMethod = classNameMini + "." + joinPoint.getSignature().getName(); + + // 排除特殊类 + + // 192.168.1.1|POST|com.xxx.xxx.save|请求参数 + log.info("{}|{}|{}|{}", request.getRemoteAddr(), request.getMethod(), classMethod, stringify(joinPoint.getArgs())); + }catch (Exception e) { + // just for safe + log.error("[WebLogAspect] aop occur exception, please concat @KFCFans to fix the bug!", e); } - HttpServletRequest request = requestAttributes.getRequest(); + } - String[] classNameSplit = joinPoint.getSignature().getDeclaringTypeName().split("\\."); - String classNameMini = classNameSplit[classNameSplit.length - 1]; - String classMethod = classNameMini + "." + joinPoint.getSignature().getName(); - - // 排除特殊类 - - // 192.168.1.1|POST|com.xxx.xxx.save|请求参数 - log.info("{}|{}|{}|{}", request.getRemoteAddr(), request.getMethod(), classMethod, JSONObject.toJSONString(joinPoint.getArgs())); + /** + * 序列化请求对象,需要特殊处理无法序列化的对象(HttpServletRequest/HttpServletResponse) + * @param args Web请求参数 + * @return JSON字符串 + */ + private static String stringify(Object[] args) { + if (ArrayUtils.isEmpty(args)) { + return null; + } + List objList = Lists.newLinkedList(); + for (Object obj : args) { + if (obj instanceof HttpServletRequest || obj instanceof HttpServletResponse) { + break; + } + objList.add(obj); + } + return JSONObject.toJSONString(objList); } } diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/controller/InstanceController.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/controller/InstanceController.java index 5b1ee3da..95785aa4 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/controller/InstanceController.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/controller/InstanceController.java @@ -1,9 +1,7 @@ package com.github.kfcfans.oms.server.web.controller; -import com.github.kfcfans.oms.common.InstanceStatus; -import com.github.kfcfans.oms.common.OmsConstant; -import com.github.kfcfans.oms.common.response.ResultDTO; import com.github.kfcfans.oms.common.model.InstanceDetail; +import com.github.kfcfans.oms.common.response.ResultDTO; import com.github.kfcfans.oms.server.akka.OhMyServer; import com.github.kfcfans.oms.server.common.utils.OmsFileUtils; import com.github.kfcfans.oms.server.persistence.PageResult; @@ -17,7 +15,6 @@ import com.github.kfcfans.oms.server.service.InstanceLogService; import com.github.kfcfans.oms.server.service.instance.InstanceService; import com.github.kfcfans.oms.server.web.request.QueryInstanceRequest; import com.github.kfcfans.oms.server.web.response.InstanceInfoVO; -import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Example; @@ -28,7 +25,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.File; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -65,8 +62,8 @@ public class InstanceController { return ResultDTO.success(null); } - @GetMapping("/status") - public ResultDTO getRunningStatus(String instanceId) { + @GetMapping("/detail") + public ResultDTO getInstanceDetail(String instanceId) { return ResultDTO.success(instanceService.getInstanceDetail(Long.valueOf(instanceId))); } @@ -120,38 +117,8 @@ public class InstanceController { } private PageResult convertPage(Page page) { - List content = page.getContent().stream().map(instanceLogDO -> { - InstanceInfoVO instanceInfoVO = new InstanceInfoVO(); - BeanUtils.copyProperties(instanceLogDO, instanceInfoVO); - - // 状态转化为中文 - instanceInfoVO.setStatusStr(InstanceStatus.of(instanceLogDO.getStatus()).getDes()); - // 额外设置任务名称,提高可读性 - instanceInfoVO.setJobName(cacheService.getJobName(instanceLogDO.getJobId())); - - // ID 转化为 String(JS精度丢失) - instanceInfoVO.setJobId(instanceLogDO.getJobId().toString()); - instanceInfoVO.setInstanceId(instanceLogDO.getInstanceId().toString()); - if (instanceLogDO.getWfInstanceId() == null) { - instanceInfoVO.setWfInstanceId(OmsConstant.NONE); - }else { - instanceInfoVO.setWfInstanceId(String.valueOf(instanceLogDO.getWfInstanceId())); - } - - // 格式化时间 - if (instanceLogDO.getActualTriggerTime() == null) { - instanceInfoVO.setActualTriggerTime(OmsConstant.NONE); - }else { - instanceInfoVO.setActualTriggerTime(DateFormatUtils.format(instanceLogDO.getActualTriggerTime(), OmsConstant.TIME_PATTERN)); - } - if (instanceLogDO.getFinishedTime() == null) { - instanceInfoVO.setFinishedTime(OmsConstant.NONE); - }else { - instanceInfoVO.setFinishedTime(DateFormatUtils.format(instanceLogDO.getFinishedTime(), OmsConstant.TIME_PATTERN)); - } - - return instanceInfoVO; - }).collect(Collectors.toList()); + List content = page.getContent().stream() + .map(x -> InstanceInfoVO.from(x, cacheService.getJobName(x.getJobId()))).collect(Collectors.toList()); PageResult pageResult = new PageResult<>(page); pageResult.setData(content); diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/response/InstanceInfoVO.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/response/InstanceInfoVO.java index 4b50069e..bf91331d 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/response/InstanceInfoVO.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/web/response/InstanceInfoVO.java @@ -1,6 +1,11 @@ package com.github.kfcfans.oms.server.web.response; +import com.github.kfcfans.oms.common.InstanceStatus; +import com.github.kfcfans.oms.common.OmsConstant; +import com.github.kfcfans.oms.server.persistence.core.model.InstanceInfoDO; import lombok.Data; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.beans.BeanUtils; /** * InstanceInfo 对外展示对象 @@ -36,4 +41,37 @@ public class InstanceInfoVO { private String actualTriggerTime; // 结束时间(同理,需要格式化) private String finishedTime; + + public static InstanceInfoVO from(InstanceInfoDO instanceInfoDo, String jobName) { + InstanceInfoVO instanceInfoVO = new InstanceInfoVO(); + BeanUtils.copyProperties(instanceInfoDo, instanceInfoVO); + + // 状态转化为中文 + instanceInfoVO.setStatusStr(InstanceStatus.of(instanceInfoDo.getStatus()).getDes()); + // 额外设置任务名称,提高可读性 + instanceInfoVO.setJobName(jobName); + + // ID 转化为 String(JS精度丢失) + instanceInfoVO.setJobId(instanceInfoDo.getJobId().toString()); + instanceInfoVO.setInstanceId(instanceInfoDo.getInstanceId().toString()); + if (instanceInfoDo.getWfInstanceId() == null) { + instanceInfoVO.setWfInstanceId(OmsConstant.NONE); + }else { + instanceInfoVO.setWfInstanceId(String.valueOf(instanceInfoDo.getWfInstanceId())); + } + + // 格式化时间 + if (instanceInfoDo.getActualTriggerTime() == null) { + instanceInfoVO.setActualTriggerTime(OmsConstant.NONE); + }else { + instanceInfoVO.setActualTriggerTime(DateFormatUtils.format(instanceInfoDo.getActualTriggerTime(), OmsConstant.TIME_PATTERN)); + } + if (instanceInfoDo.getFinishedTime() == null) { + instanceInfoVO.setFinishedTime(OmsConstant.NONE); + }else { + instanceInfoVO.setFinishedTime(DateFormatUtils.format(instanceInfoDo.getFinishedTime(), OmsConstant.TIME_PATTERN)); + } + + return instanceInfoVO; + } }