springboot切面logdemo

简介: `LogAspect` 类为一个 Spring AOP 切面,用于日志记录。它拦截 `com.mryan.aop_mylog.controller` 包下的所有方法调用。方法入参和出参信息会被记录,异常情况也会被捕获并处理。代码使用了 `@Around` 注解进行环绕通知,并通过 ` ProceedingJoinPoint` 获取方法信息。日志通过 `Logger.getLogger(LogAspect.class)` 进行输出。

 

package com.mryan.aop_mylog.utils;
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.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
import java.util.logging.Logger;
@Aspect
@Component
public class LogAspect {
    private static Logger log = Logger.getLogger("LogAspect.class");
    @Around("execution(* com.mryan.aop_mylog.controller..*.*(..))")
    @ResponseBody
    public Object logAround(ProceedingJoinPoint joinPoint) throws Exception {
        String uuid = UUID.randomUUID().toString();//用于串联起来出入日志 防止并发混乱
        Object result = null;
        String className = joinPoint.getTarget().getClass().getSimpleName();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        String methodName = methodSignature.getName();
        StringBuilder paramInSb = null;
        StringBuilder paramOutSb = null;
        Object[] args = joinPoint.getArgs();
        if (args.length > 0) {
            paramInSb = new StringBuilder();
            String[] argNames = methodSignature.getParameterNames();
            paramInSb.append(className).append(".").append(methodName).append("-->").append(uuid).append("入参---->");
            for (int i = 0; i < argNames.length; i++) {
                if ((!(args[i] instanceof MultipartFile)) && (!(args[i] instanceof HttpServletRequest)) && (!(args[i] instanceof HttpServletResponse) && (!(args[i] instanceof MultipartFile[])))) {
                    paramInSb.append(argNames[i]).append(":");
//                            append(JSON.toJSONString(args[i]));
                }
            }
            log.info(paramInSb.toString());
        }
        try {
            result = joinPoint.proceed();
            paramOutSb = new StringBuilder();
            paramOutSb.append(className).append(".").append(methodName).append("-->").append(uuid).append("出参:");
//                    .append(JSON.toJSONString(result));
            log.info(paramOutSb.toString());
        } catch (Exception e) {
//            log.error("Log-->方法执行异常");
            throw e;
        } catch (Throwable throwable) {
//            log.error("Log-->方法执行错误", throwable);
//            throw new Exception(ResponseCode.FAILURE, "未知错误");
        }
        return result;
    }
}

image.gif


目录
打赏
0
6
6
1
30
分享
相关文章
Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一种技术。
3235 1
|
1月前
|
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
62 0
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
42 0
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
SpringBoot整合AOP实现打印方法执行时间切面
SpringBoot整合AOP实现打印方法执行时间切面
82 1
springboot切面编程基础实践
springboot切面编程基础实践
[AIGC] Spring Boot中的切面编程和实例演示
[AIGC] Spring Boot中的切面编程和实例演示
154 0

热门文章

最新文章