package tz.lion.Utils.aop; import com.alibaba.fastjson.JSON; import org.springframework.web.multipart.MultipartFile; import tz.lion.config.shiro.SessionHolder; import tz.lion.domain.master.SysUser; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; /** * aop实现web层的日志切面 * @author 104 */ @Aspect @Component public class WebLogAspect { private Logger logger = LoggerFactory.getLogger("webLogAspect"); ThreadLocal startTime = new ThreadLocal (); /** * 定义一个切入点 */ @Pointcut("execution(public * tz.lion.controller.*..*.*(..))") public void webLog(){} /** * 定义一个非切入点 * controller 方法名称,以UnAop 开头 不打印日志;例如文件参数等长字符 */ @Pointcut("!execution(public * tz.lion.controller.*..*.UnAop*(..))") private void logSender(){} /** * 处理日志,打印请求相关数据 * @param joinPoint */ @Before("webLog()&&logSender()") public void doBefore(JoinPoint joinPoint){ startTime.set(System.currentTimeMillis()); SysUser user = SessionHolder.getHolder().getSessionAttribute(SessionHolder.CURRENT_USER); if(user != null){ logger.info("UserId : "+user.getId()); } // 接收到请求,记录请求内容 logger.info("WebLogAspect.doBefore()"); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); try{ // 记录下请求内容 logger.info("URL : " + request.getRequestURL().toString()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); boolean hasFile=false; for(Object obj:joinPoint.getArgs()){ if(obj instanceof MultipartFile){ hasFile=true; } } if(hasFile){ logger.info("ARGS : 上传文件接口 "); }else{ logger.info("ARGS : " + JSON.toJSONString(joinPoint.getArgs())); } }catch(Exception e){ logger.info("获取请求参数失败"); } Enumeration enu=request.getParameterNames(); while(enu.hasMoreElements()){ String paraName=enu.nextElement(); logger.info("request paraName ARGS"+paraName+": "+request.getParameter(paraName)); } } /** * 处理完请求,返回内容 * @param joinPoint */ @AfterReturning(returning="result", pointcut = "webLog()") public void doAfterReturning(JoinPoint joinPoint,Object result){ logger.info("WebLogAspect.doAfterReturning()"); String res = JSON.toJSONString(result); if(res.length()<=2000){ logger.info("返回数据:"+res); } logger.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get())); } }