LogAspect.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package com.ifast.common.aspect;
  2. import java.lang.reflect.Method;
  3. import java.util.Arrays;
  4. import java.util.Date;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import org.aspectj.lang.ProceedingJoinPoint;
  8. import org.aspectj.lang.annotation.Around;
  9. import org.aspectj.lang.annotation.Aspect;
  10. import org.aspectj.lang.annotation.Pointcut;
  11. import org.aspectj.lang.reflect.MethodSignature;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.context.request.RequestContextHolder;
  17. import org.springframework.web.context.request.ServletRequestAttributes;
  18. import com.ifast.common.annotation.Log;
  19. import com.ifast.common.base.BaseDO;
  20. import com.ifast.common.dao.LogDao;
  21. import com.ifast.common.domain.LogDO;
  22. import com.ifast.common.utils.HttpContextUtils;
  23. import com.ifast.common.utils.IPUtils;
  24. import com.ifast.common.utils.JSONUtils;
  25. import com.ifast.common.utils.ShiroUtils;
  26. import com.ifast.sys.domain.UserDO;
  27. /**
  28. * <pre>
  29. * 日志切面
  30. * </pre>
  31. * <small> 2018年3月22日 | Aron</small>
  32. */
  33. @Aspect
  34. @Component
  35. public class LogAspect {
  36. @Autowired
  37. private LogDao logMapper;
  38. private Logger log = LoggerFactory.getLogger(getClass());
  39. @Pointcut("@annotation(com.ifast.common.annotation.Log)")
  40. public void logPointCut() {
  41. }
  42. @Around("logPointCut()")
  43. public Object around(ProceedingJoinPoint point) throws Throwable {
  44. long beginTime = System.currentTimeMillis();
  45. // 执行方法
  46. Object result = point.proceed();
  47. // 执行时长(毫秒)
  48. long time = System.currentTimeMillis() - beginTime;
  49. // 保存日志
  50. saveLog(point, time);
  51. return result;
  52. }
  53. @Pointcut("execution(public * com.ifast.*.controller.*.*(..))")
  54. public void logController(){}
  55. /** 记录controller日志,包括请求、ip、参数、响应结果 */
  56. @Around("logController()")
  57. public Object controller(ProceedingJoinPoint point) throws Throwable {
  58. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  59. HttpServletRequest request = attributes.getRequest();
  60. log.info("{} {} {} {}.{}{}", request.getMethod(), request.getRequestURI(), IPUtils.getIpAddr(request), point.getTarget().getClass().getSimpleName(), point.getSignature().getName(), Arrays.toString(point.getArgs()));
  61. long beginTime = System.currentTimeMillis();
  62. Object result = point.proceed();
  63. long time = System.currentTimeMillis() - beginTime;
  64. log.info("result({}) {}", time, JSONUtils.beanToJson(result));
  65. return result;
  66. }
  67. @Pointcut("execution(public * com.ifast.*.service.*.*(..))")
  68. public void logService(){}
  69. /** 记录自定义service接口日志,如果要记录CoreService所有接口日志请仿照logMapper切面 */
  70. @Around("logService()")
  71. public Object service(ProceedingJoinPoint point) throws Throwable {
  72. log.info("call {}.{}{}", point.getTarget().getClass().getSimpleName(), point.getSignature().getName(), Arrays.toString(point.getArgs()));
  73. long beginTime = System.currentTimeMillis();
  74. Object result = point.proceed();
  75. long time = System.currentTimeMillis() - beginTime;
  76. log.info("result({}) {}", time, JSONUtils.beanToJson(result));
  77. return result;
  78. }
  79. @Pointcut("within(com.baomidou.mybatisplus.mapper.BaseMapper+)")
  80. public void logMapper(){}
  81. /** 记录mapper所有接口日志,设置createBy和updateBy基础字段,logback会记录sql,这里记录查库返回对象 */
  82. @Around("logMapper()")
  83. public Object mapper(ProceedingJoinPoint point) throws Throwable {
  84. String methodName = point.getSignature().getName();
  85. boolean insertBy = false, updateBy = false;
  86. switch(methodName) {
  87. case "insert":
  88. case "insertAllColumn":
  89. insertBy = true;
  90. break;
  91. case "update":
  92. case "updateById":
  93. case "updateAllColumnById":
  94. updateBy = true;
  95. break;
  96. }
  97. if(insertBy || updateBy) {
  98. Object arg0 = point.getArgs()[0];
  99. if(arg0 instanceof BaseDO) {
  100. Long userId = ShiroUtils.getUserId();
  101. if(userId != null) {
  102. BaseDO baseDO = (BaseDO)arg0;
  103. if(insertBy) {
  104. baseDO.setCreateBy(userId);
  105. }else {
  106. baseDO.setUpdateBy(userId);
  107. }
  108. }
  109. }
  110. }
  111. log.info("call {}.{}{}", point.getTarget().getClass().getSimpleName(), methodName, Arrays.toString(point.getArgs()));
  112. long beginTime = System.currentTimeMillis();
  113. Object result = point.proceed();
  114. long time = System.currentTimeMillis() - beginTime;
  115. log.info("result({}) {}", time, JSONUtils.beanToJson(result));
  116. return result;
  117. }
  118. /**
  119. * <pre>
  120. * 保存日志
  121. * </pre>
  122. * <small> 2018年3月22日 | Aron</small>
  123. * @param joinPoint
  124. * @param time
  125. */
  126. private void saveLog(ProceedingJoinPoint joinPoint, long time) {
  127. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  128. Method method = signature.getMethod();
  129. LogDO sysLog = new LogDO();
  130. Log syslog = method.getAnnotation(Log.class);
  131. if (syslog != null) {
  132. // 注解上的描述
  133. sysLog.setOperation(syslog.value());
  134. }
  135. // 请求的方法名
  136. String className = joinPoint.getTarget().getClass().getName();
  137. String methodName = signature.getName();
  138. String params = null;
  139. HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
  140. if(request != null) {
  141. sysLog.setMethod(request.getMethod()+" "+request.getRequestURI());
  142. Map<String, String[]> parameterMap = request.getParameterMap();
  143. params = JSONUtils.beanToJson(parameterMap);
  144. // 设置IP地址
  145. sysLog.setIp(IPUtils.getIpAddr(request));
  146. }else {
  147. sysLog.setMethod(className + "." + methodName + "()");
  148. Object[] args = joinPoint.getArgs();
  149. params = JSONUtils.beanToJson(args);
  150. }
  151. int maxLength = 4999;
  152. if(params.length() > maxLength){
  153. params = params.substring(0, maxLength);
  154. }
  155. sysLog.setParams(params);
  156. // 用户名
  157. UserDO currUser = ShiroUtils.getSysUser();
  158. if (null == currUser) {
  159. sysLog.setUserId(-1L);
  160. sysLog.setUsername("");
  161. } else {
  162. sysLog.setUserId(currUser.getId());
  163. sysLog.setUsername(currUser.getUsername());
  164. }
  165. sysLog.setTime((int) time);
  166. // 系统当前时间
  167. Date date = new Date();
  168. sysLog.setGmtCreate(date);
  169. // 保存系统日志
  170. logMapper.insert(sysLog);
  171. }
  172. }