基于SpringAop和ThreadLocal实现的收集与处理请求方法埋点信息的日志工具包

基于SpringAop和ThreadLocal实现的收集与处理请求方法埋点信息的日志工具包 1,项目简介 设计目的和场景 : 使用Spring AOP拦截方法参数大部分做法基本上大同小异

本文包含相关资料包-----> 点击直达获取<-------

基于SpringAop和ThreadLocal实现的收集与处理请求方法埋点信息的日志工具包

1.项目简介

设计目的和场景 :

  • 使用Spring AOP拦截方法参数大部分做法基本上大同小异,不用每个项目工程都写AOP拦截处理日志的代码,引入此包即可。
  • 可获取埋点方法的请求参数,响应参数,请求头,以及内部耗时,方法是成功还是失败,自定义步骤记录等等信息。
  • 整个方法完整过程只产生一个埋点信息记录(一个LogData对象),比如 @Controller 中一次完整的http请求。
  • 收集情况可选,可只在异常时执行收集过程(有些只是为了排查问题打印的日志,程序正常运行时其实毫无意义)。
  • 埋点信息收集,自行实现收集过程,比如埋点日志打印,常见埋点日志写入数据库,写入到文件,写入队列等等。
  • 埋点信息收集不干扰埋点方法正常流程,收集过程异步化处理(默认,可通过注解的 asyncMode 进行设置),不影响正常请求方法的性能与响应。
  • 只需通过 @AopLog 注解(或者自定义切面)决定是否埋点收集。

2.快速开始

2.1项目通过 Maven仓库地址 的pom.xml引入。

```xml

com.github.ealenxie aop-log 2.5

```

2.2或者通过gradle引入

gradle compile group: 'com.github.ealenxie', name: 'aop-log', version: '2.5'

3.使用方法

3.1@AopLog注解使用,进行埋点收集

直接在类(作用类的所有方法)或类方法(作用于方法)上加上注解 @AopLog ,进行埋点收集

例如 :

```java

@AopLog(type = "测试接口", stackTraceOnErr = true) @RestController public class AppController {

@GetMapping("/app/sayHello")
public RespBody<String> sayHello() {
    return RespBody.ok("hello EalenXie");
}

}

```

3.2自定义全局的日志收集器实现收集 LogCollector

例如只是简单打印,或写入到库等等。

```java

import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.LogData; import com.github.collector.LogCollector; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;

/* * @author EalenXie create on 2020/9/15 13:46 * 此为样例参考 * 配置一个简单的日志收集器 这里只是做了一个log.info打印一下,可以在这里写入到数据库中或者写入 / @Slf4j @Component public class AopLogCollector implements LogCollector { private ObjectMapper objectMapper = new ObjectMapper();

@Override
public void collect(LogData logData) {
    try {
        log.info(objectMapper.writeValueAsString(logData));
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

} ```

配置 @Component 的全局日志收集器只能配置一个。

接口调用 /say/hello 测试即可看看到控制台打印出结果 :

2020-09-16 16:01:04.782 INFO 2012 --- [AsyncExecutor-2] name.ealen.infra.advice.AopLogCollector : {"appName":"app-template","host":"127.0.0.1","port":8080,"clientIp":"192.168.110.1","reqUrl":"http://localhost:8080/app/sayHello","httpMethod":"GET","headers":{"User-Agent":"Apache-HttpClient/4.5.10 (Java/11.0.5)"},"type":"测试","content":"","method":"name.ealen.api.facade.AppController#sayHello","args":null,"respBody":{"code":"200","desc":"OK","message":"请求成功","dateTime":"2020-09-16 16:01:04","body":"hello EalenXie"},"logDate":1600243264780,"costTime":1,"threadName":"http-nio-8080-exec-3","threadId":33,"success":true}

3.3埋点日志对象LogData属性说明

LogData 埋点日志对象获取的内容

字段 类型 注释
appName String 应用名称
host String 主机
port int 端口号
clientIp String 请求客户端的Ip
reqUrl String 请求地址
headers Object 请求头部信息(可选择获取) 默认获取user-agent,content-type
tag String 操作标签,默认值undefined
content String 方法步骤内容,默认是空,可使用LogData.step进行内容步骤记录
method String 请求的本地java方法
args Object 方法请求参数
respBody Object 方法响应参数
costTime long 整个方法内部耗时
logDate Date Log产生时间,LogData对象初始化的时间
threadName String 线程名称
threadId long 线程Id
success boolean 执行状态,成功(true)/异常(false)

3.4AopLog 注解选项说明

选项 类型 说明 默认
logOnErr boolean 仅当发生异常时才收集 false
tag String 操作标签 默认值"undefined"
headers String[] 获取的header信息 ,选择要获取哪些header信息 默认"User-Agent","content-type"
args boolean 是否获取请求参数 true
respBody boolean 是否获取响应参数 true
stackTraceOnErr boolean 当目标方法发生异常时,是否追加异常堆栈信息到LogData的content中 false
asyncMode boolean 异步方式收集 true
collector Class<? extends LogCollector> 指定日志收集器 默认不调整收集器,使用全局的日志收集器

3.5LogData的step方法。

记录步骤。(如果某些重要步骤希望被记录下来) 例如 :

```java

import com.github.AopLog; import com.github.LogData; import name.ealen.infra.base.resp.RespBody; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;

/* * @author EalenXie create on 2020/6/22 14:28 / @AopLog(tag = "测试", stackTraceOnErr = true) @RestController public class AppController {

@GetMapping("/app/sayHello")
public RespBody<String> sayHello() {
    LogData.step("1. 第一步执行完成");
    //......
    LogData.step("2. 第二步执行完成");
    //.....
    LogData.step("3. service的方法执行完成");
    //.....
    return RespBody.ok("hello EalenXie");
}

}

```

此时再次接口调用 /say/hello 测试即可看看到控制台打印出结果,重点观察content字段 :

2020-09-16 17:26:20.285 INFO 3284 --- [AsyncExecutor-2] name.ealen.infra.advice.AopLogCollector : {"appName":"app-template","host":"127.0.0.1","port":8080,"clientIp":"192.168.110.1","reqUrl":"http://localhost:8080/app/sayHello","httpMethod":"GET","headers":{"User-Agent":"Apache-HttpClient/4.5.10 (Java/11.0.5)"},"tag":"测试","content":"1. 第一步执行完成\n2. 第二步执行完成\n3. service的方法执行完成\n","method":"name.ealen.api.facade.AppController#sayHello","args":null,"respBody":{"code":"200","desc":"OK","message":"请求成功","dateTime":"2020-09-16 17:26:20","body":"hello EalenXie"},"logDate":1600248380283,"costTime":1,"threadName":"http-nio-8080-exec-2","threadId":32,"success":true}

"content":"1. 第一步执行完成\n2. 第二步执行完成\n3. service的方法执行完成\n"

3.6不通过@AopLog注解,通过自定义切面进行收集

自定义切面注入 AopLogProcessor ,调用 proceed(config, point) 即可

```java

import com.github.AopLogConfig; import com.github.AopLogProcessor; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/* * Created by EalenXie on 2021/7/14 10:29 * 自定义切面 / @Aspect @Component public class CustomLogDataAspect {

@Resource
private AopLogProcessor aopLogProcessor;
private static final AopLogConfig CONFIG;

static {
    CONFIG = new AopLogConfig();
    CONFIG.setTag("操作标签");
    CONFIG.setStackTraceOnErr(false);
    CONFIG.setHeaders(new String[]{"content-type", "user-agent"});
}

// 自定义切点 execution(public * com.test.web.TestController.*(..))
@Pointcut("execution(public * com.test.web.TestController.*(..))")
public void test() {
    //ig
}

// 请使用环绕通知 @Around()
@Around("test()")
public Object note(ProceedingJoinPoint point) throws Throwable {
    return aopLogProcessor.proceed(CONFIG, point);
}

}

```

参考文献

  • 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)
  • 自动监控的微服务应用开发框架的设计与实现(华中科技大学·李军)
  • 基于Spring实现J2EE企业应用开发框架的研究与应用(武汉理工大学·梅锋)
  • 基于J2EE的学生信息管理系统(电子科技大学·钟海琴)
  • 基于Spring实现J2EE企业应用开发框架的研究与应用(武汉理工大学·梅锋)
  • 面向中小企业的信息管理系统的设计与实现(北京邮电大学·贾士强)
  • 软件公司项目进度管理系统的研究与实现(沈阳工业大学·王微)
  • 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)
  • 基于Spring Cloud的埋点管理与分析系统的设计与实现(华中科技大学·王雅琪)
  • 基于J2EE的学生信息管理系统(电子科技大学·钟海琴)
  • 项目管理系统的规划与设计(吉林大学·梁雪欢)
  • 基于JavaEE计算机资源审批系统(华南理工大学·罗正杰)
  • 基于J2EE的辽油通信小灵通服务下载系统的设计与实现(电子科技大学·吴文哲)
  • 一个分布式链路追踪系统TraceUI的设计与实现(南京大学·夏晓喻)
  • 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码码头 ,原文地址:https://bishedaima.com/yuanma/35611.html

相关推荐

  • 基于Springboot+RabbitMQ+redis实现的超市订单管理系统

    基于Springboot+RabbitMQ+redis实现的超市订单管理系统 1 系统需求分析 超市订单管理系统是一个专为连锁店,超市等商业场所提供订单管理平台的系统
    2024年05月14日
    5 1 2
  • 基于mybatis的时间日程管理系统

    基于 MyBatis 的时间日程管理系统 1 绪论 1,1 背景 随着时代的进步,网络技术层出不穷信息量急剧膨胀,整个人类社会已成为信息化的社会
    2024年05月14日
    2 1 1
  • 新手python简单的飞机游戏

    game 一个新手做的python简单的飞机游戏 参考文献 基于Java EE的个人博客管理系统的设计和实现(内蒙古大学·闫伟光) 深度可定制的工具化爬虫系统的设计与实现(北京邮电大学·李笑语) 航空订票服务器爬虫检测技术研究(杭州电子科技大学·陈万烤) 主题爬虫关键技术研究(哈尔滨工程大学·黄正德) 机票票价预测系统设计与实现(大连理工大学·陈岩松) 深度可定制的工具化爬虫系统的设计与实现(北京邮电大学·李笑语) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 机票票价预测系统设计与实现(大连理工大学·陈岩松) 山东航空货运业务管理系统的设计与实现(山东大学·高辉) 飞行情报资料管理信息系统设计与实现(中国地质大学(北京)·张晓琴) 山东航空货运业务管理系统的设计与实现(山东大学·高辉) 豆玩手机游戏平台的设计与实现(吉林大学·李天明) 面向高职信息技术教育的严肃游戏设计与实施(大连理工大学·王晓姝)
    2024年05月14日
    1 1 1
  • 基于JSP实现的校园师生交流系统

    基于JSP实现的校园师生交流系统 第1章 课设任务 1,1 课程题目 师生交流系统的设计与开发 1,2 课设目的 复习,巩固JavaWeb的基础知识
    2024年05月14日
    17 1 3
  • 基于Python实现手写数字识别

    基于 TensorFlow 框架的手写数字识别系统 摘要 时下人工智能蔚然成风,作为新型生产要素,在各个领域都极大地推动了经济发展,预示着社会经济将取得巨大增长和和人类潜能将得到深度开发
    2024年05月14日
    4 1 2
  • 基于springboot和ftp实现的网盘文件系统

    基于springboot和ftp实现的网盘文件系统 1,项目简介 因为开发中很多时候都需要上传和下载文件,所以想开发出一个模块,用于文件的上传和下载,自然而然也就想到了网盘
    2024年05月14日
    4 1 1
  • 基于Spring与Spark开发电影推荐网站

    电影推荐系统 演示效果 演示视频 环境搭建 ES ``` docker run -p 9200:9200 -p 9300:9300 --name='es' -d -v /home/k8s-develop/movie/elasticsearch
    2024年05月14日
    4 1 1
  • 基于Python的智能监控平台

    基于Python的智能监控平台 1,环境配置 网站使用了 Flask 框架,安装 Flask : pip install Flask Flask 连接 mysql 数据库需要库 flask_sqlalchemy 和库 pymysql
    2024年05月14日
    2 1 1
  • JavaWeb电商项目

    基于 javaweb 技术的在线电子商城系统 摘 要 随着人们生活水平的提高,对物质要求也越来越高,人们网购的消费也逐年增长,所以电子商务发展十分迅速
    2024年05月14日
    3 1 2
  • 大数据中的文本挖掘之Python

    大数据中的文本挖掘 Introduction 本次作业的任务是故事生成,即给定一个故事标题,要求输出 5 个句子的短故事,我们力图复现一下论文(Seq2Seq
    2024年05月14日
    1 1 1

发表回复

登录后才能评论