springBoot+AOP收集日志信息,自定义接口实现日志收集

  之前做的ELK日志分析,没有收集到日志,都 是一些没有规则的输出,提取数据也相对复杂,

今天 有时间就稍微实现了一下利用SpringBoot Aop的方式打印想要的数据格式,

 第一步,自定义接口, ElementType 参数里可以指定注入的位置,比如包,类,方法,还有变量,枚举等

package com.yitai.tms.version.app;

import java.lang.annotation.Retention;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)//ElementType.TYPE //可以注入在接口、类、枚举、注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Logweb {
	String value() default "";
}
//@Target注解是标注这个类它可以标注的位置,常用的元素类型(ElementType):
//@Retention注解表示的是本注解(标注这个注解的注解保留时期)

第二步  实现方式,打印日志的格式,还有一些其它要统一处理的信息都 可以汇聚在这里处理,我把打印日志用 | 分隔开,是为了后面收集 信息方便,大家可以随意定义方式,打印一些其它信息

如果 不是自定义的方式 ,@Pointcut("@annotation(com.yitai.tms.version.app.Logweb)")这里可以写自己包下面的包含要注入的方法,比如 要自动打印 test.controller 包下面所有方法  test.controller.*.*(..)  等这种方式

package com.yitai.tms.version.app;

import java.util.Arrays;
import java.util.Date;

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.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;


/**
 * @author lmc
 * @Email [email protected]
 * @date 2018年9月10日
 */
@Aspect
@Component
public class LogWebAspect {

	private static final  Logger  logger= LoggerFactory.getLogger(LogWebAspect.class);
	// 定义切点 Pointcut
	@Pointcut("@annotation(com.yitai.tms.version.app.Logweb)")//自定义接口实现 
	public void LogPointcut(){}
	
	 @Before("LogPointcut()")
	 public void doBefore(JoinPoint joinPoint){
		 // 接收到请求,记录请求内容
	        logger.info("LogWebAspect.doBefore()");
	        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
	        HttpServletRequest request = attributes.getRequest();
	        //有格式的打印日志,收集日志信息到ES
	        logger.info(new Date().getTime()+"|" + request.getRequestURL().toString()+"|"+request.getMethod()+"|"+
	        joinPoint.getSignature().getDeclaringTypeName() +"|"+Arrays.toString(joinPoint.getArgs()));
	        // 记录下请求内容
	        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());

	        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
	        //类方法
	        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+
	                "."+joinPoint.getSignature().getName());
	        //参数
	        logger.info("args={}",joinPoint.getArgs());
	    }
	    @AfterReturning(returning = "ret", pointcut = "LogPointcut()")
	    public void doAfterReturning(Object ret) throws Throwable {
	        // 处理完请求,返回内容
	        logger.info("RESPONSE : " + ret);
	    }

	
}

第三步  在控制层controller  注入  @Logweb("求访问所有版本信息")  接口,就可以打印信息,这个是作用在方法上,前面提到,如果作用到包或者类上可以把ElementType.TYPE 改成这个参数

private MyLog logger = MyLog.getLog(VersionAdmin.class);
	@Logweb("求访问管车宝后台的所有版本信息") // 放置的位置在方法上,打印日志,
	@ResponseBody  
	@GetMapping("/getversionlist") 
	PageUtils versionInit() {
		logger.info("date: "+new Date());
		try {
			HashMap map = new HashMap<>();
			List vmlist = versionService.versionList(map);
			PageUtils pageUtils = new PageUtils(vmlist,vmlist.size());
			return pageUtils;
		} catch (Exception e) {
			logger.error("分页查询出错", e);
			return null;
		}
	}

最后就是输出格式了

springBoot+AOP收集日志信息,自定义接口实现日志收集_第1张图片

一个简单的AOP日志收集功能就这些,希望对一些入门的人有点帮助。

你可能感兴趣的:(spring,boot)