springboot项目Api访问日志监控

通过aop实现日志记录,核心类如下:

package com.it.elk.aop;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.TimeZone;

import javax.servlet.http.HttpServletRequest;

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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSONObject;
import com.it.elk.kafka.KafkaSender;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @ClassName: AopLogAspect 
 * @description: ELK拦截日志信息
 * @date 2019年4月26日 下午2:30:12 
 * @version V1.0
 */
@Slf4j
@Aspect
@Component
public class AopLogAspect {
	@Autowired
	private KafkaSender<JSONObject> kafkaSender;

	// 申明一个切点 里面是 execution表达式
	@Pointcut("execution(* com.it.*.api.service.impl.*.*(..))")
	private void serviceAspect() {
	}

	// 请求method前打印内容
	@Before(value = "serviceAspect()")
	public void methodBefore(JoinPoint joinPoint) {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes();
		HttpServletRequest request = requestAttributes.getRequest();

		JSONObject jsonObject = new JSONObject();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
		// 请求时间
		jsonObject.put("request_time", df.format(new Date()));
		// 请求URL
		jsonObject.put("request_url", request.getRequestURL().toString());
		//请求ip
		jsonObject.put("request_ip", getIpAddr(request));
		// 请求的方法
		jsonObject.put("request_method", request.getMethod());
		// 请求类方法
		jsonObject.put("signature", joinPoint.getSignature());
		// 请求参数
		jsonObject.put("request_args", Arrays.toString(joinPoint.getArgs()));

		// 加上ip和端口号
		JSONObject requestJsonObject = new JSONObject();
		requestJsonObject.put("request", jsonObject);

		kafkaSender.send(requestJsonObject);
	}

	// 在方法执行完结后打印返回内容
	@AfterReturning(returning = "obj", pointcut = "serviceAspect()")
	public void methodAfterReturing(JoinPoint joinPoint,Object obj) {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = requestAttributes.getRequest();
		log.info("===============after请求内容===============");
		log.info("after请求地址:" + request.getRequestURL().toString());
		log.info("after请求方式:" + request.getMethod());
		log.info("after请求类方法:" + joinPoint.getSignature());
		log.info("after请求类方法参数:" + Arrays.toString(joinPoint.getArgs()));
		 
		JSONObject respjsonObject = new JSONObject();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
		df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		//请求ip
		respjsonObject.put("request_ip", getIpAddr(request));
		// 请求URL
		respjsonObject.put("request_url", request.getRequestURL().toString());
		// 请求方式
		respjsonObject.put("request_method", request.getMethod());
		// 请求类方法
		respjsonObject.put("signature", joinPoint.getSignature());
		// 请求参数
		respjsonObject.put("request_args", Arrays.toString(joinPoint.getArgs()));
		 
		 
		log.info("--------------after返回内容----------------");
		// 响应时间
		respjsonObject.put("response_time", df.format(new Date()));
		// 响应内容
		respjsonObject.put("response_content", JSONObject.toJSONString(obj));
		 
		JSONObject result = new JSONObject();
		result.put("response_log", respjsonObject);
		log.info("after>>>>>>>>>>"+result);
		kafkaSender.send(result);

	}
	// 多个项目 每个项目对应不同的主题 不同的主题对应不同的Logstash
	
	/**
	 * 获取Ip地址
	 * 
	 * @param request
	 * @return
	 */
	public String getIpAddr(HttpServletRequest request) {
		String ip = request.getHeader("X-Forwarded-For");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_CLIENT_IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值