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

 更新时间:2022年03月31日 15:20:59   作者:张泓锐  
这篇文章主要介绍了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日志收集管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 中的 BufferedReader 介绍_动力节点Java学院整理

    Java 中的 BufferedReader 介绍_动力节点Java学院整理

    BufferedReader 是缓冲字符输入流。它继承于Reader。接下来通过本文给大家介绍BufferedReader的相关知识,需要的朋友参考下吧
    2017-05-05
  • common-upload上传文件功能封装类分享

    common-upload上传文件功能封装类分享

    本文介绍一个common-upload上传封装类,为了更方便的上传文件,对common-upload进行了一个简单的封装,大家参考使用吧
    2014-01-01
  • Java小程序求圆的周长和面积实例

    Java小程序求圆的周长和面积实例

    这篇文章主要介绍了首先用蒙塔卡洛算法求圆周率近似值,然后根据此近似值输出圆的周长和面积,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • 浅谈Java模板引擎性能对比

    浅谈Java模板引擎性能对比

    本篇文章主要介绍了浅谈Java模板引擎性能对比 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringBoot3中数据库集成实践详解

    SpringBoot3中数据库集成实践详解

    项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,所以下面小编就来和大家讲讲SpringBoot3如何实现数据库集成,需要的可以参考下
    2023-08-08
  • windows系统使用mvn命令打包并指定jdk路径方式

    windows系统使用mvn命令打包并指定jdk路径方式

    这篇文章主要介绍了windows系统使用mvn命令打包并指定jdk路径方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解Mybatis框架SQL防注入指南

    详解Mybatis框架SQL防注入指南

    这篇文章主要介绍了详解Mybatis框架SQL防注入指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 多线程如何解决for循环效率的问题

    多线程如何解决for循环效率的问题

    这篇文章主要介绍了多线程如何解决for循环效率的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Linux将Spring Boot项目的Jar包注册为开机自启动系统服务的操作方法

    Linux将Spring Boot项目的Jar包注册为开机自启动系统服务的操作方法

    jar文件是从maven package打包出来的,config/application.yml是原先在项目的resources文件夹里,外置出来方便适配开发环境和正式环境,这篇文章主要介绍了Linux将Spring Boot项目的Jar包注册为开机自启动系统服务的操作方法,需要的朋友可以参考下
    2023-10-10
  • SpringBoot中的YAML配置文件和日志详解

    SpringBoot中的YAML配置文件和日志详解

    这篇文章主要介绍了SpringBoot中的YAML配置文件和日志的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12

最新评论