SpringBoot 记录操作日志

目录结构:

1、创建springboot项目,添加依赖。

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

2、自定义注解@Log

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {

    String value() default "";

}

3、设置切面


import com.wzq.log.annotation.Log;
import org.aspectj.lang.ProceedingJoinPoint;
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.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class LogAspect {
    @Pointcut("@annotation(com.wzq.log.annotation.Log)")
    public void logPointCut() {
    }

    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable, InterruptedException {
        System.out.println("=============================");
        Object result = point.proceed();
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        String name = method.getName();
        System.out.println("Method Name:" + name);//输出方法名
        Log log = method.getAnnotation(Log.class);
        System.out.println("Log Value:" + log.value());//输出注解里面的值
        System.out.println("+++++++++++++++++++++++++++++");
        return result;
    }
}

4、Controller用户测试效果

import com.wzq.log.annotation.Log;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@RestController
public class TestController {

    @GetMapping("/list")
    @Log("获取Student列表")
    public List list() {
        List list = new ArrayList();
        for(int i = 0 ; i < 10 ; i++){
            Student student = new Student();
            student.setId(i);
            student.setName("name"+i);
            list.add(student);
        }
        return list;
    }

    @GetMapping("/getone")
    @Log("获取Student")
    public Student success() {
        Student student = new Student();
        student.setId(10);
        student.setName("name"+10);
        return student;
    }

}

class Student implements Serializable {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

浏览器返回数据:

http://localhost:8080/list

http://localhost:8080/getone

控制台打印:

 

 

 

 

 

### Spring Boot 中基于 AOP日志记录配置 要在 Spring Boot 应用程序中通过 AOP 实现日志记录功能,可以按照以下方式完成配置。 #### 1. 引入必要的依赖 为了支持 AOP 功能,在 `pom.xml` 文件中需要引入 `spring-boot-starter-aop` 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 此依赖会自动集成 AspectJ 和其他所需的库来支持切面编程[^3]。 --- #### 2. 创建切面类并定义切点 创建一个带有 `@Component` 和 `@Aspect` 注解的 Java 类作为切面。在此类中定义切点和通知逻辑。 ##### 示例代码: ```java package com.example.demo.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); // 定义切点:匹配所有被 @Log 注解标记的方法 @Pointcut("@annotation(com.example.demo.log.Log)") public void loggableMethods() {} // 前置通知:方法执行前的日志记录 @Before("loggableMethods()") public void beforeMethodExecution() { logger.info("Method execution is about to start."); } // 后置返回通知:方法成功完成后记录响应数据 @AfterReturning(pointcut = "loggableMethods()", returning = "result") public void afterSuccessfulExecution(Object result) { logger.info("Method executed successfully with result: {}", result); } } ``` 上述代码中,`LoggingAspect` 是一个切面类,它拦截了所有标注有自定义注解 `@Log` 的方法,并在其前后分别记录日志信息[^4]。 --- #### 3. 自定义注解用于标识需记录日志的目标方法 可以通过创建一个简单的注解来标记哪些方法需要触发日志记录行为。 ##### 示例代码: ```java package com.example.demo.log; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log { String value() default ""; } ``` 这个注解可以在任何业务方法上使用,从而让其成为切点的一部分。 --- #### 4. 测试场景中的应用 假设有一个控制器类如下所示: ```java package com.example.demo.controller; import com.example.demo.log.Log; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/test") public class TestController { @GetMapping("/hello") @Log(value = "User accessed the hello endpoint.") public String sayHello() { return "Hello, World!"; } } ``` 当访问 `/api/test/hello` 接口时,由于该方法被 `@Log` 注解修饰,因此会在调用之前和之后触发相应的日志记录逻辑。 --- #### 织入过程说明 织入是指将切面逻辑注入到目标对象的过程。在 Spring Boot 中,默认情况下,这种织入发生在运行时(Runtime Weaving)。这意味着无需额外工具即可实现动态代理机制下的增强效果[^5]。 --- ### 总结 以上展示了如何利用 Spring Boot 提供的支持快速搭建起一套基础版的操作日志管理系统。具体来说,主要涉及以下几个方面的工作内容: - **引入 AOP 相关 Starter**; - **编写切面组件及其内部逻辑**; - **设计可扩展性强的元数据标签体系**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值