java利用aop来记录接口的请求耗时、请求参数、请求url等详细信息

最近在项目里面需要对一些controller接口进行记录。记录的信息包括,接口的耗时、请求参数、请求url、是否成功、请求的ip地址。
最后利用aop切面编程。

@Order(1)
@Aspect
@Component
@Slf4j
public class BehaviorAop  {@AutowiredBehaviorService behaviorService;/** 我们对ApiOperation 这个注解进行切面,也就是说controller里面的方法只要被这个注解修饰,那么这个方法都会被记录详细信息,ApiOperation 这个注解是swagger的注解,当然我们也能自定义注解。/@Pointcut("@annotation(io.swagger.annotations.ApiOperation)")public void annotationTo() {}@Around("annotationTo()")public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {BehaviorRecordMo behaviorRecordMo = new BehaviorRecordMo();StopWatch watch = new StopWatch();try {log.debug("目标方法执行前...");//通过切面获取当前执行的方法Object target = joinPoint.getTarget();Signature sig = joinPoint.getSignature();MethodSignature msig = (MethodSignature) sig;Method method = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);//记录接口名字if (EmptyUtils.isNotEmpty(apiOperation) && EmptyUtils.isNotEmpty(apiOperation.value())) {behaviorRecordMo.setName(apiOperation.value());}Enumeration<String> attributeNames = request.getAttributeNames();behaviorRecordMo.setAppName("app-name");behaviorRecordMo.setUserId(request.getHeader(AdminHeaderEnum.adminId.name()));behaviorRecordMo.setIp(WebUtils.getIp(request));behaviorRecordMo.setCreateTime(LocalDateTime.now());behaviorRecordMo.setRefererUrl(request.getHeader(WxHeaderEnum.Referer.name()));behaviorRecordMo.setRefererName(request.getHeader(WxHeaderEnum.Referer.name()));behaviorRecordMo.setUrl(request.getRequestURI());behaviorRecordMo.setMethod(request.getMethod());//获取接口的请求参数behaviorRecordMo.setParam(argsToString(joinPoint.getArgs()));watch.start();//开始执行具体的业务方法Object result = joinPoint.proceed();//业务方法执行结束watch.stop();log.debug("目标方法返回结果后...");ResultBean resultBean = null;try {resultBean = (ResultBean) result;behaviorRecordMo.setStatus(resultBean.getStatus());behaviorRecordMo.setMsg(resultBean.getMsg());} catch (Exception e) {behaviorRecordMo.setStatus(ResultStatusEnum.SUCCESS.getStatus());}behaviorRecordMo.setTime(watch.getTime());behaviorService.insert(behaviorRecordMo);return result;} catch (Exception e) {log.debug("执行目标方法异常后...");watch.stop();behaviorRecordMo.setStatus(ResultStatusEnum.FAIL.getStatus());behaviorRecordMo.setMsg(e.getMessage());behaviorRecordMo.setTime(watch.getTime());behaviorService.insert(behaviorRecordMo);//异常通知throw e;}}private String argsToString(Object[] args) {StringBuffer stringBuffer = new StringBuffer();if (EmptyUtils.isNotEmpty(args)) {for (Object object : args) {if (object instanceof HttpServletRequest) {stringBuffer.append("HttpServletRequest" + ";\n");} else if (object instanceof HttpServletResponse) {stringBuffer.append("HttpServletResponse" + ";\n");} else if (object instanceof MultipartFile) {stringBuffer.append("MultipartFile" + ";\n");} else {stringBuffer.append(JsonLUtils.toJSon(object) + ";\n");}}}return stringBuffer.toString();}
}

然后我们在controller里面对一些方法加上@ApiOperation这个注解

    @ApiOperation(value = "统计在线顾问人数", notes = "统计在线顾问人数")@GetMapping("/count/agent")public ResultBean<List<List<AgentOfflineAreaCountVo>>> offlineCountDetail(@RequestParam String svOrderId) {List<List<AgentOfflineAreaCountVo>> agentOnlineCountMap = this.agentOfflineService.offlineCountDetail(svOrderId);return super.success(agentOnlineCountMap);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言结构体的初始化方式

逐个初始化字段&#xff1a;这是最直接的方式&#xff0c;你可以逐个为结构体的每个字段进行初始化。 struct Student { char name[50]; int age; float marks; }; struct Student student1 {"Alice", 20, 89.5}; 2.使用结构体字面值初始化&#xff1a;这种方…

Elasticsearch 分布式搜索——聚合

1.聚合的种类 聚合常见的有三类&#xff1a; **桶&#xff08;Bucket&#xff09;**聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例…

用户忠诚度:小程序积分商城的用户保持方法

随着移动互联网的蓬勃发展&#xff0c;小程序积分商城已经成为了许多企业私域营销的热门选择。这个商城不仅可以吸引用户参与&#xff0c;还可以提高用户的忠诚度&#xff0c;进一步加深用户与品牌的互动关系。然而&#xff0c;要实现用户的忠诚度&#xff0c;需要一系列的策略…

C++的内存管理是怎样的?

目录 C的内存管理代码段数据段BSS段堆区映射区栈区 C的内存管理 在C中&#xff0c;虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区、栈区六部分&#xff1a; 代码段 包括只读存储区和文本区&#xff0c;其中只读存储区存储字符串常量,文本区存储程序的机器代码。 数据…

生信豆芽菜-机器学习筛选特征基因

网址&#xff1a;http://www.sxdyc.com/mlscreenfeature 一、使用方法 1、准备数据 第一个文件&#xff1a;特征表达数据 第二个文件&#xff1a;分组信息&#xff0c;第一列为样本名&#xff0c;第二列为患者分组 第三个文件&#xff1a;分析基因名 2、选择机器学习的方…

【C语言】入门——结构体

目录 结构体 为什么有结构体&#xff1f; 1.结构体的声明 1.2结构体变量的访问和初始化 2.结构体成员的访问 结构体 struct 结构体类型 {//相关属性; }结构体变量; 结构体和数组不同&#xff0c;同一类型的数据的集合是数组&#xff1b; 结构体是多种类型的数据的集合&…

使用GPT-4生成训练数据微调GPT-3.5 RAG管道

OpenAI在2023年8月22日宣布&#xff0c;现在可以对GPT-3.5 Turbo进行微调了。也就是说&#xff0c;我们可以自定义自己的模型了。然后LlamaIndex就发布了0.8.7版本&#xff0c;集成了微调OpenAI gpt-3.5 turbo的功能 也就是说&#xff0c;我们现在可以使用GPT-4生成训练数据&a…

被百度判定为低质量网站了!如何整改?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 先说结论&#xff1a;接受现实&#xff0c;不要幻想百度恢复了! 百度自9月初大批量删除百度资源平台权限以来&#xff0c;几乎90%(未经证实**&#xff0c;但数量确实不小)的网站都被取消了权限&am…

vue3中的reactive赋值问题

问题 当通过方法对reactive变量修改的时候&#xff0c;发现页面上的值没有及时更新&#xff1f; 解决方法 具体原因: 上面这样赋值检测不到&#xff0c;因为响应式的是它的属性&#xff0c;而不是它自身. 方法1: 单个赋值 如下&#xff1a; let obj reactive({name: zha…

MySql学习笔记07——存储引擎介绍

存储引擎 Mysql中特有的术语&#xff0c;Oracle中没有。 存储引擎就是一个表存储/组织数据的方式。不同的存储引擎&#xff0c;表存储数据的方式不同。 指定存储引擎 在建表的时候可以在最后小括号的")"的右边使用&#xff1a; ENGINE来指定存储引擎。 CHARSET来…

YOLO目标检测——火焰检测数据集+已标注xml和txt格式标签下载分享

实际项目应用&#xff1a;火灾预警系统、智能监控系统、工业安全管理、森林火灾监测以及城市规划和消防设计等应用场景中具有广泛的应用潜力&#xff0c;可以提高火灾检测的准确性和效率&#xff0c;保障人员和财产的安全。数据集说明&#xff1a;YOLO火焰目标检测数据集&#…

GuLi商城-前端基础Vue-整合ElementUI快速开发

npm安装 启动项目&#xff1a;npm run dev http://localhost:8082/#/hello

02-Tomcat打破双亲委派机制

Tomcat 如果使用默认的双亲委派类加载机制行不行&#xff1f; 我们思考一下&#xff1a;Tomcat是个web容器&#xff0c; 那么它要解决什么问题&#xff1a; 一个web容器可能需要部署两个应用程序&#xff0c;不同的应用程序可能会依赖同一个第三方类库的不同版本&#xff0c;…

记:一次关于paddlenlp、python、版本之间的兼容性问题

兼容版本 Python 3.10.8 absl-py1.4.0 accelerate0.19.0 addict2.4.0 aiofiles23.1.0 aiohttp3.8.3 aiosignal1.3.1 alembic1.10.4 aliyun-python-sdk-core2.13.36 aliyun-python-sdk-kms2.16.0 altair4.2.2 altgraph0.17.3 aniso86019.0.1 antlr4-python3-runtime4.9.3 anyi…

问道管理:华为产业链股再度拉升,捷荣技术6连板,华力创通3日大涨近70%

华为产业链股6日盘中再度拉升&#xff0c;到发稿&#xff0c;捷荣技能涨停斩获6连板&#xff0c;华映科技亦涨停收成3连板&#xff0c;华力创通大涨超19%&#xff0c;蓝箭电子涨约11%&#xff0c;力源信息涨超4%。 捷荣技能盘中再度涨停&#xff0c;近7日已累计大涨超90%。公司…

Pycharm通用设置个性化设置

Pycharm通用设置&个性化设置 通用设置取消打开Pycharm自动进入项目开启【Ctrl鼠标滑轮】放大缩小字体 个性化设置设置彩虹括号 通用设置 取消打开Pycharm自动进入项目 选择选择菜单【File】>【Settings】进入设置页面选择【Appearance & Behavior】>【System S…

Git使用经验总结3-删除远端提交记录

文章目录 1. 问题2. 解决方案3. 参考 1. 问题 如果将有问题的代码提交到代码仓库甚至已经push到远端&#xff0c;这个时候就得想办法把提交撤销。一种方案是使用git revert&#xff0c;不过会造成历史记录留存的问题&#xff0c;git revert实际上是将某个版本又重新提交了一遍…

c++中的对齐问题

c中的对齐问题 需要对齐的原因 尽管内存是以字节为单位&#xff0c;但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存&#xff0c;我们将上述这些存取单位称为内存存取粒度. 现在考虑4字节存取粒度的处理器取in…

搜索二维矩阵 II

题目链接 搜索二维矩阵 II 题目描述 注意点 矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 解答思路 最初想到使用深度优先遍历剪枝实现&#xff0c;但是运行后超出时间限制了可以直接遍历整个矩阵查找&#xff0c;虽然不超时…

Excel VSTO开发-目录

1 VSTO简介2 建立Excel VSTO项目3 代码调试4 其他事件5 Excel对象结构6 Range对象7 可视化界面开发8 相关控件9 使用Form窗口10 自定义任务面板11 自定义菜单项 相关代码下载&#xff1a; https://download.csdn.net/download/UruseiBest/88306532?spm1001.2014.3001.5503 学…