LogAspect.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.steerinfo.dil.aspect;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.steerinfo.dil.annotaion.LogAround;
  5. import com.steerinfo.dil.mapper.LogResultMapper;
  6. import com.steerinfo.dil.model.LogResult;
  7. import com.steerinfo.dil.util.DataChange;
  8. import com.steerinfo.framework.controller.RESTfulResult;
  9. import lombok.extern.java.Log;
  10. import org.apache.log4j.Logger;
  11. import org.aspectj.lang.ProceedingJoinPoint;
  12. import org.aspectj.lang.Signature;
  13. import org.aspectj.lang.annotation.Around;
  14. import org.aspectj.lang.annotation.Aspect;
  15. import org.aspectj.lang.annotation.Pointcut;
  16. import org.aspectj.lang.reflect.MethodSignature;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Component;
  20. import java.lang.reflect.Method;
  21. import java.text.DateFormat;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. /**
  25. * 日志 Aspect切面,编写切入点的方法
  26. */
  27. @Aspect
  28. @Component
  29. public class LogAspect {
  30. @Value("${prefix.logPrefix}")
  31. private String logPrefix;
  32. @Autowired
  33. LogResultMapper logResultMapper;
  34. static final Logger log = Logger.getLogger(LogAspect.class);
  35. private DateFormat format =new SimpleDateFormat("yyyy-MM-dd");
  36. /**
  37. * 定义切入点,所有该注解为切入点
  38. */
  39. @Pointcut("@annotation(com.steerinfo.dil.annotaion.LogAround)")
  40. public void AroundPointCut(){}
  41. /**
  42. * 环绕通知 @Around,日志文件同时记录方法的入参出参,数据库只保留成功的出参
  43. * @param point
  44. * @return
  45. *
  46. * @throws Throwable
  47. */
  48. @Around("AroundPointCut()")
  49. public Object around(ProceedingJoinPoint point) throws Throwable {
  50. //获取该切点处的方法及入参
  51. Method method = ((MethodSignature) point.getSignature()).getMethod();
  52. Object[] requestParams = point.getArgs();
  53. JSONObject map = null;
  54. for(Object param:requestParams){
  55. if(param!=null && param instanceof Map){
  56. map = JSONObject.parseObject(JSONObject.toJSONString(param));
  57. break;
  58. }
  59. }
  60. if(map==null || map.get("userId")==null ||map.get("userName") ==null){
  61. log.error("缺乏日志必要参数"+map);
  62. // Map<String,Object> resultMap = new HashMap<>();
  63. // resultMap.put("code","500");
  64. // resultMap.put("message","缺乏日志必要参数");
  65. // resultMap.put("data","缺乏日志必要参数"+map);
  66. // return resultMap;
  67. }
  68. //获取切点处的注解及其参数
  69. LogAround logAround = method.getAnnotation(LogAround.class);
  70. String[] foreignKeys = logAround.foreignKeys();
  71. String[] foreignKeyTypes = logAround.foreignKeyTypes();
  72. String description = logAround.description();
  73. //获取方法签名
  74. Signature signature = point.getSignature();
  75. String methodName = method.getName();
  76. log.info("执行===" + methodName + "===开始");
  77. log.info("方法描述:" + description);
  78. log.info("方法名:" + signature);
  79. log.info("方法参数:" + map);
  80. //记录当前时间
  81. Date beginTime = new Date();
  82. //执行方法,并取得返回值
  83. Object response = null;
  84. try{
  85. response = point.proceed();
  86. }catch (Exception e){
  87. //记录错误日志
  88. log.error("执行===" + methodName + "===异常:"+ e.getClass().getName());
  89. log.error("方法描述:" + description);
  90. log.error("方法名:" + signature);
  91. log.error("方法参数:" + requestParams);
  92. throw e;
  93. }
  94. //解析返回值,记录日志
  95. try{
  96. RESTfulResult result = JSONObject.parseObject(JSONObject.toJSONString(response),RESTfulResult.class);
  97. //获取执行时间
  98. long exeCost = System.currentTimeMillis() - beginTime.getTime();
  99. if(RESTfulResult.SUCCEED.equals(result.getStatus())){
  100. //执行成功,记录正常日志
  101. log.info("方法返回:" + JSON.toJSONString(result));
  102. log.info("执行时间(ms):"+exeCost);
  103. log.info("执行===" + methodName + "===成功");
  104. try{
  105. //data数组
  106. List<Map<String,Object>> datas = new ArrayList<>();
  107. //记录到数据库
  108. List<LogResult> logResults=new ArrayList<>();
  109. //检查返回data类型
  110. if(result.getData() instanceof Map){
  111. Map<String,Object> data =(Map) result.getData();
  112. datas.add(data);
  113. }else if(result.getData() instanceof List){
  114. datas =(List) result.getData();
  115. }else{
  116. throw new Exception("无法处理的数据类型!");
  117. }
  118. //批量处理
  119. for(Map<String,Object> data : datas){
  120. for(int i=0 ; i<foreignKeys.length ; i++){
  121. if(data.get(foreignKeys[i]) != null){
  122. LogResult logResult=new LogResult();
  123. logResult.setLogId(logResultMapper.nextId());
  124. logResult.setForeignKeyId(DataChange.dataToBigDecimal(data.get(foreignKeys[i])));
  125. logResult.setForeignKeyType(foreignKeyTypes[i]);
  126. logResult.setLogContent(map.get("userName")+":"+result.getMessage());
  127. logResult.setMethodName(""+signature);
  128. logResult.setMethodDescription(description);
  129. logResult.setInsertTime(beginTime);
  130. logResult.setExeCost(DataChange.dataToBigDecimal(exeCost));
  131. logResult.setFilePath(logPrefix+format.format(beginTime));
  132. logResult.setInsertUsername(""+map.get("userId"));
  133. logResult.setRemark("自动记录");
  134. logResults.add(logResult);
  135. }
  136. }
  137. }
  138. if(logResults.size() > 0){
  139. logResultMapper.batchInsert(logResults);
  140. }else{
  141. throw new Exception("目标foreignKey不存在!");
  142. }
  143. }catch (Exception e){
  144. log.info("记录日志失败:"+e.getMessage());
  145. }
  146. }else{
  147. //记录失败日志
  148. log.info("方法返回:" + JSON.toJSONString(result));
  149. log.info("执行时间(ms):"+exeCost);
  150. log.info("执行===" + methodName + "===失败");
  151. }
  152. }catch (Exception e){
  153. //记录错误日志
  154. log.error("===日志解析、记录失败===:\n"+ e.getMessage());
  155. }
  156. return response;
  157. }
  158. }