springBoot+AOP收集日志信息,自定义接口实现日志收集
日期: 2018-09-10 分类: 个人收藏 392次阅读
之前做的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 huyang@126.com
* @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<VersionModel> vmlist = versionService.versionList(map);
PageUtils pageUtils = new PageUtils(vmlist,vmlist.size());
return pageUtils;
} catch (Exception e) {
logger.error("分页查询出错", e);
return null;
}
}
最后就是输出格式了
一个简单的AOP日志收集功能就这些,希望对一些入门的人有点帮助。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐