SpringAOP实现日志收集管理功能(步骤详解)

第一步引入必要的依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.15</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>

第二步创建自定义日志注解类

package com.example.aop.log.annotion;
import java.lang.annotation.*;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:56
 */
@Inherited
@Target({ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface LogNotice {}

第三步切面设计,扫描上面的注解

package com.example.aop.log.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:59
 */
@Aspect
@Component
public class LogAspect {
  @Pointcut("@annotation(com.example.aop.log.annotion.LogNotice)")
  public void doLog() {}
  @Around("doLog()")
  public Object insertLog(ProceedingJoinPoint joinPoint) throws Throwable {
    Object object = joinPoint.proceed();
    try {
      HashMap paramsMap;
      Signature signature = joinPoint.getSignature();
      Method method = ((MethodSignature) signature).getMethod();
      String methodName = method.getName();
      String className = method.getDeclaringClass().getName();
      paramsMap = (HashMap) getParams(joinPoint, method);
      // 打印日志,可以记录到数据库的日志表里面,等到有客户反馈的时候好去查询日志
      System.out.println(
          "methodName: " + methodName + "; className: " + className + "; paramsMap:" + paramsMap);
      // 也可以记录请求当前接口耗费的时间
    } catch (Exception e) {
      // 如果在日志记录的过程中出现问题,那么要处理一下异常,不要直接抛出,此处做成消息队列通知或者打印日志
    }
    // 此处要进行返回代理的对象,如果没有返回的话,前端是收不到数据的
    return object;
  }
  private Map<String, Object> getParams(ProceedingJoinPoint joinPoint, Method method) {
    // get parameter names
    String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method);
    Object[] args = joinPoint.getArgs();
    Map<String, Object> params = new HashMap<>(8);
    if (parameterNames != null && parameterNames.length != 0) {
      for (int i = 0; i < parameterNames.length; i++) {
        params.put(parameterNames[i], args[i]);
      }
    return params;
}

第四步把自定义的注解放到你的接口上面

package com.example.demo.controller;
import com.example.aop.log.annotion.LogNotice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author zhr_java@163.com
 * @date 2022/3/29 20:50
 */
@RestController
@RequestMapping("/person")
public class PersonController {
  //在此处加上你自定义的注解(@LogNotice)
  @LogNotice
  @GetMapping("get_person")
  public String getPerson(Integer numbers) {
    return "123";
  }
}

第五步测试

到此这篇关于SpringAOP实现日志收集管理功能的文章就介绍到这了,更多相关SpringAOP日志收集管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springAop实现权限管理数据校验操作日志的场景分析

    前言 作为一个写java的使用最多的轻量级框架莫过于spring,不管是老项目用到的springmvc,还是现在流行的springboot,都离不开spring的一些操作,我在面试的时候问的最多的spring的问题就是我们在平常的项目中使用spring最多的有哪几个点 在我看来无非就两个 spring的bean管理,说的高大上一点就是spring的ioc,di spring的AOP spring是一个很强大的轻量级框架,功能远不止这两点,但是我们用的最多的就是这两点. spring bean 管

  • SpringAop实现操作日志记录

    前言 大家好,这里是经典鸡翅,今天给大家带来一篇基于SpringAop实现的操作日志记录的解决的方案.大家可能会说,切,操作日志记录这么简单的东西,老生常谈了.不! 网上的操作日志一般就是记录操作人,操作的描述,ip等.好一点的增加了修改的数据和执行时间.那么!我这篇有什么不同呢!今天这种不仅可以记录上方所说的一切,还增加记录了操作前的数据,错误的信息,堆栈信息等.正文开始~~~~~ 思路介绍 记录操作日志的操作前数据是需要思考的重点.我们以修改场景来作为探讨.当我们要完全记录数据的流向的时候,

  • 使用SpringAOP获取用户操作日志入库

    目录 SpringAOP获取用户操作日志入库 记录操作日志的一般套路 SpringAOP获取用户操作日志入库 切service层中所有的方法,将有自定义注解的方法的操作日志入库,其中需要注意的几点: 注意aspectjweaver.jar包的版本,一般要1.6以上版本,否则会报错 注意是否使用了双重代理,spring.xml中不需要配置切面类的<bean>,否则会出现切两次的情况 注意返回的数据类型,如果是实体类需要获取实体类中每个属性的值,若该实体类中的某个属性也是实体类,需要再次循环获取该

  • SpringAop日志找不到方法的处理

    SpringAop日志找不到方法 错误截图: 显示没有找到该方法,于是我找到对应的类和对应的方法: 这里我用了反射来获取方法名和参数: 错误打印的结果显示方法名获取没有错误,于是我查看参数的类型是否有错 结果一个都对不上- int类型反射得到的class: Integer反射得到的Class: -终于知道之前错误里的Ljavexxxx是哪里来的了- 由于model是一个接口 model反射的Class得到的是他的子类org.springframework.validation.support.B

  • SpringAOP实现日志收集管理功能(步骤详解)

    第一步引入必要的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactI

  • iOS 10 和Xcode8 一起 创建 Siri 功能步骤详解(OC写的 )

    iOS 10 出来之后,我们开发者也可以使用类似Siri的功能..让我们来看看怎么使用吧,其实他是使用Siri里面的一个语音识别框架Speech framework. 让我们来看看 一些 主要的代码吧. 我们需要一个 UITextView 和 UIButton 就 能体现了. 第一步:定义属性 @interface ViewController () <SFSpeechRecognizerDelegate> @property (strong, nonatomic) UIButton *sir

  • 用Python实现简单的人脸识别功能步骤详解

    前言 让我的电脑认识我,我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确性比较高的一种. 一.首先 梳理一下实现人脸识别需要进行的步骤: 流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花

  • Java日志API管理最佳实践详解

    概述 对于现在的应用程序来说,日志的重要性是不言而喻的.很难想象没有任何日志记录功能的应用程序运行在生产环境中.日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行时间信息等.在生产环境中,日志是查找问题来源的重要依据.应用程序运行时的产生的各种信息,都应该通过日志 API 来进行记录. 很多开发人员习惯于使用 System.out.println.System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息.这

  • vue导入处理Excel表格功能步骤详解

    目录 1. 前言 2.vue导入Excel表格 2.1 使用ElementUI中的upload组件 2.2 使用input文件上传 3. 总体代码与效果 4. 总结 1. 前言 最近遇到前端导入并处理excel表格的情况,趁此机会刚好研究一下vue导入并处理excel数据:当然自己手撸一个工具没有那么多时间,本文只是借助现有的工具来做一下工具使用总结. 2.vue导入Excel表格 vue导入Excel表格主要有两种常用的方法,一个是借助ElementUI文件上传进行表格导入,另一个是自带的in

  • Vue实现导入Excel功能步骤详解

    1.前端主导实现步骤 第一步,点击页面上的导入按钮,读入Excel文件 利用插件完成. 第二步,按照后端的要求对数据格式加工,转成他们需要的格式 需要自己写逻辑. 第三步,通过后端接口,将数据通过ajax发回去 调接口,常规操作. 简而言之:前端读excel文件,修改文件格式,调接口 2.实现读入Excel文件 注:此步骤就可实现前端导入功能.如对修改格式有兴趣,可以继续看第三步. 概括:复制代码到自己的文件夹下,下载必需的插件. 2.1 使用的是elementUI提供的vue-admin-el

  • mysql使用自定义序列实现row_number功能(步骤详解)

    看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `name` varchar(10), `subject` varchar(10), `score` int(10) ) 第二步:写入数据 insert into grades(name, subject, score) values('小明', '语文', 85), ('小华', '语文', 89), (

  • Rancher通过界面管理K8s平台的图文步骤详解

    目录 一.Rancher 简介 1.Rancher API Server 的功能 2.Rancher 主要组件和功能图示 二.Rancher 安装 1.通过 Docker 来进行安装 2.在 Rancher 的界面上绑定 K8s 3.在 Rancher 上部署应用 一.Rancher 简介 Rancher 是为使用容器的公司打造的容器管理平台,通过 Rancher,企业不再需要使用一系列开源软件从零开始构建一个容器服务平台.同时 Rancher 还提供了一个全栈容器部署和管理平台,用于管理 Do

  • Spring框架实现AOP添加日志记录功能过程详解

    这篇文章主要介绍了Spring框架实现AOP添加日志记录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求,在调用业务方法的时候,在被调用的业务方法的前面和后面添加上日志记录功能 整体架构: 日志处理类: package aop; import java.util.Arrays; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; //日志处理类 增

  • idea使用pagehelper实现后端分页功能的步骤详解

    PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. 下面分步骤给大家介绍idea使用pagehelper实现后端分页功能,具体内容如下所示: 第一步:在pom.xml中添加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-

随机推荐