打印访问接口日志

public class RequestLogAspect {

	@Autowired(required = false)
	HttpServletRequest request;

	private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	@Around(value = PointCut.CONTRLLER_POINTCUT)
	public Object aroundController(ProceedingJoinPoint jp) throws Throwable {
		log.info("****访****问****开****始***************************************************");
		// 记录处理业务前的日志信息
		LogParam lp = new LogParam();
		if (!lp.hasLogin) {
			return jp.proceed();
		}
		log.info("[请求路径]==>{}", lp.getUrl());
		log.info("[请求方式]==>{}", lp.getReqmethod());
		log.info("[请求参数]==>{}", lp.getParams());
		log.info("[请求时间]==>{}", lp.getStartDate());
		log.info("[请求用户]==>{}", lp.getUserName());

		// ****************************************
		Object result = jp.proceed(); // 处理业务 *
		// ****************************************

		// 记录处理业务后的日志信息
		RequestLog rl = recordLog(jp, lp, result);
		log.info("[处理结果]==>{}", rl.getEntrance());
		log.info("[访问耗时]==>{}", rl.getUseTime() + "毫秒");
		log.info("****访****问****结****束***************************************************");
		return result;
	}

	private RequestLog recordLog(JoinPoint joinPoint, LogParam logParam, Object result) {
		RequestLog requestLog = new RequestLog(); // 设置访问用户
		// 主键
		requestLog.setId(getLogId());
		// 用户信息
		requestLog.setUserId(logParam.getUserId());
		requestLog.setUserName(logParam.getUserName());
		// IP地址
		requestLog.setIp(request.getRemoteHost());
		// 访问路径
		requestLog.setUrl(gainUrl());
		// 访问方法
		requestLog.setMethod(logParam.getReqmethod());
		// 访问资源名称
		requestLog.setAction(getControllerMethodInfo(joinPoint));
		// 访问参数
		requestLog.setParams(logParam.getParams());
		// 处理结果
		String resultMessage = createResultMessage(result);
		requestLog.setEntrance(resultMessage);
		// 访问时间
		long et = System.currentTimeMillis();
		long startTime = logParam.getStartTime().getTime();
		requestLog.setStartTime(startTime);
		requestLog.setEndTime(et);
		long useTime = et - startTime;
		requestLog.setUseTime(useTime);
		// 放到消息队列里,异步打包存到数据库或els
		LogQueue.put(requestLog);
		return requestLog;
	}

	private String getLogId() {
		Object logIdObj = MDC.get(StaticValue.SYSLOG_ID);
		if (null == logIdObj) {
			return SnowFlake.nextKey();
		}
		return String.valueOf(logIdObj);
	}

	private String createResultMessage(Object result) {
		String handlResult = null;
		if (null != result && result instanceof JsonResult) {
			JsonResult jr = (JsonResult) result;
			Context context = new Context().put("code", jr.getCode()).put("message", jr.getMessage());
			handlResult = context.toString();
		} else {
			handlResult = "0";
		}
		return handlResult;
	}

	private String gainParams() {
		Enumeration<String> parameterNames = this.request.getParameterNames();
		Context context = new Context();
		while (parameterNames.hasMoreElements()) {
			String nextElement = parameterNames.nextElement();
			String value = this.request.getParameter(nextElement);
			if (isNotNull(value)) {
				value = value.length() > 25 ? value.substring(0, 25) : value;
				context.put(nextElement, value);
			}
		}
		if (!context.isEmpty()) {
			return context.toString();
		}
		return "";
	}

	private String gainUrl() {
		return request.getRequestURI().replaceAll(request.getContextPath(), "");
	}

	public static String getControllerMethodInfo(JoinPoint joinPoint) {
		// 获取目标类名
		Class<?> targetClass = joinPoint.getTarget().getClass(); // 方法名
		String methodName = joinPoint.getSignature().getName(); // 生成类对象

		// 获取该类中的方法
		Method[] methods = targetClass.getMethods();
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				SystemLog annotation = method.getAnnotation(SystemLog.class);
				if (null != annotation) {
					return annotation.value();
				} else {
					break;
				}
			}
		}
		return targetClass.getSimpleName() + "." + methodName;
	}

	class LogParam {
		private String params;
		private Date startTime;
		private String startDate;
		private User user;
		private String url;
		private String reqmethod;
		private String userId;
		private String userName;
		private boolean hasLogin = true;

		public LogParam() {
			this.user = UserUtils.getLoginUser();
			if (null == this.user) {
				this.hasLogin = false;
			}else{
				this.userId = user.getId();
				this.userName = user.getUserName();
			}
			this.startTime = new Date();
			this.startDate = sdf.format(startTime);
			this.url = request.getRequestURL().toString();
			this.reqmethod = request.getMethod();
			this.params = gainParams();
		}

		public boolean isHasLogin() {
			return hasLogin;
		}

		public void setHasLogin(boolean hasLogin) {
			this.hasLogin = hasLogin;
		}

		public String getUserId() {
			return userId;
		}

		public void setUserId(String userId) {
			this.userId = userId;
		}

		public String getParams() {
			return params;
		}

		public void setParams(String params) {
			this.params = params;
		}

		public Date getStartTime() {
			return startTime;
		}

		public void setStartTime(Date startTime) {
			this.startTime = startTime;
		}

		public String getStartDate() {
			return startDate;
		}

		public void setStartDate(String startDate) {
			this.startDate = startDate;
		}

		public WholeUser getUser() {
			return user;
		}

		public void setUser(WholeUser user) {
			this.user = user;
		}

		public String getUrl() {
			return url;
		}

		public void setUrl(String url) {
			this.url = url;
		}

		public String getReqmethod() {
			return reqmethod;
		}

		public void setReqmethod(String reqmethod) {
			this.reqmethod = reqmethod;
		}

		public String getUserName() {
			return userName;
		}

		public void setUserName(String userName) {
			this.userName = userName;
		}

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值