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

网友投稿 408 2022-08-16


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

第一步引入必要的依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-devtools

runtime

true

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

org.springframework

spring-aop

5.3.15

org.aspectj

aspectjweaver

1.9.2

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

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 (ExceioDJiption e) {

// 如果在日志记录的过程中出现问题,那么要处理一下异常,不要直接抛出,此处做成消息队列通知或者打印日志

}

// 此处要进行返回代理的对象,如果没有返回的话,前端是收不到数据的

return object;

}

private Map getParams(ProceedingJoinPoint joinPoint, Method method) {

// get parameter names

String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method);

Object[] args = joinPoint.getArgs();

Map 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.http://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";

}

}

第五步测试


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot应用jar包启动原理详解
下一篇:Mybatis详解在注解sql时报错的解决方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~