​对于日志收集,是系统离不开的功能,那么如何实现简易的日志收集呢。市面上最常见的就是使用自定义注解。本文将介绍如何使用自定义注解收集日志。

1.添加自定义注解

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {/*** 注释*/String operationName() default "";
}

2.使用AOP拦截注解

该类的含义是:没调用一个接口,都会判断该接口是否带有上文的自定义注解,如果带有,就会执行AOP中的功能,本文是获取入参,出参,sql,方法名,系统名,调用ip等参数,并打印。

@Component
public class LogAspect {private Logger logger = LoggerFactory.getLogger(LogAspect.class);private String succeed = "true";/*** 在注释@log的方法中进入本类*/@Pointcut("@annotation(com.resource.business.modular.log.annotation.Log)")public void logPointCut() {}/*** 前置通知 用于拦截操作,在方法返回后执行** @param joinPoint 切点*/@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")public void doAfter(JoinPoint joinPoint, Result jsonResult) {handleLog(joinPoint, jsonResult);}/*** 拦截异常操作,有异常时执行** @param joinPoint* @param e*/@AfterThrowing(value = "logPointCut()", throwing = "e")public void doAfter(JoinPoint joinPoint, Exception e) {Log controllerLog = getAnnotationLog(joinPoint);// 没有注解if (controllerLog == null) {return;}// 处理入参String args = this.argsArrayToString(joinPoint.getArgs());// 获取请求上下文信息ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();HttpServletResponse response = attributes.getResponse();// 获取时间SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 获取用户信息String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));// 组合入参信息logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);logger.debug("错误信息为:" + e);}/*** 判断是否有注解* * @param joinPoint* @throws Exception*/private Log getAnnotationLog(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature)signature;Method method = methodSignature.getMethod();if (method != null) {return method.getAnnotation(Log.class);}return null;}/*** 功能描述:执行日志操作** @param: joinPoint ,e ,response* @return:*/private void handleLog(final JoinPoint joinPoint, Result jsonResult) {Log controllerLog = getAnnotationLog(joinPoint);// 没有注解if (controllerLog == null) {return;}// 处理入参String args = this.argsArrayToString(joinPoint.getArgs());// 获取请求上下文信息ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();HttpServletResponse response = attributes.getResponse();// 获取时间SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 获取用户信息String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));// 组合入参信息logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);logger.info("输出参数:" + JSONArray.toJSONString(jsonResult.getData()));}/*** 组装入参* * @param paramsArray* @return*/private String argsArrayToString(Object[] paramsArray) {String params = "";if (paramsArray != null && paramsArray.length > 0) {for (int i = 0; i < paramsArray.length; i++) {if (!isFilterObject(paramsArray[i])) {Object jsonObj = JSON.toJSON(paramsArray[i]);params += jsonObj.toString() + " ";}}}if (("").equals(params.trim())) {params = "无入参";}return params.trim();}/*** 判断是否需要过滤的对象。** @param o 对象信息。* @return 如果是需要过滤的对象,则返回true;否则返回false。*/public boolean isFilterObject(final Object o) {return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;}
}

注意:楼主使用elk收集了日志,输出在logstash中获取“|” 然后拆分成不同字段,并保存在es中,可在后续文章看到。

springboot自定义注解收集操作日志相关推荐

  1. JPOM - AOP+自定义注解实现操作日志记录

    文章目录 地址 版本 源码解析-AOP+自定义注解实现操作日志记录 地址 Gitee: https://gitee.com/dromara/Jpom 官网: https://jpom.io/ 一款简而 ...

  2. Spring AOP 自定义注解记录操作日志

    1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...

  3. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  4. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

  5. 元旦加班写SpringBoot自定义注解

    写在前面 这个点我们公司的人走的已经差不多了,原因很简单呀,明天元旦嘛,放假前可是不加班的,很nice,实习生的我,今天给大家分享一篇springboot自定义注解的技术文章. 很牛逼的注解 开发过程 ...

  6. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  7. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  8. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

  9. java 自定义注解+AOP实现日志记录

    ssm版本: 1.首先自定义一个注解,该注解有两个属性,一个是模块名,一个是操作的内容.该注解是用来修饰Service层中的方法的. 2.创建一个切面类,该切面使用@Aspect和@Component ...

最新文章

  1. 能打开java文件_用java打开一个本地文件
  2. VC++ 字符串操作学习总结
  3. 跨链Cosmos(10) IBC接口
  4. 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
  5. ubuntu tomcat上传目录权限_等了 3 年,Ubuntu Studio 终于有权限上传更新包
  6. markdown与latex:如何写出具有数学符号意味的ln3\ln
  7. 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
  8. 深度学习图片分类增强数据集的方法汇总
  9. 实验1:MapReduce课程实验
  10. CorelDRAW 2020Mac、2021mac 版本正式回归 macOS免激活版
  11. 大整数乘法(Karatsuba算法的字符串形式的C++实现)
  12. CASCAN拍照式三维扫描仪精密测量叶轮和逆向设计综合技术解决方案
  13. python中的and_PYTHON中的“and”是什么意思
  14. dotNet MSIL中的一些不常见IL指令
  15. Python学习笔记 之 从入门到放弃
  16. 段里仁:十论智能交通系统在我国的发展与应用
  17. 智慧城市三维可视化平台建设
  18. 【附源码】计算机毕业设计SSM物流配送中心管理系统
  19. 安装 intel HAXM 模拟器加速器异常:Failed to configure driver: unknown error. Failed to open driver
  20. 新概念英语1册17课

热门文章

  1. 什么是撞库攻击,如何预防撞库攻击?
  2. python拉勾网招聘信息爬取(单线程,最新)
  3. webBuilder饼状图传值
  4. Scanner使用方法
  5. Android模拟登陆带验证码的网站客户端
  6. ad 如何拖动实心区域的中间点
  7. 计算机专业名词术语raid,RAID是什么意思,RAID是什么意思
  8. Java输出语句中“+”的作用
  9. silk,speex,ilbc,_转自王贵平
  10. 10大最重口味自我实验:医生吞食虫卵感染绦虫