SpringBoot 中日志管理用AOP如何轻松实现

本文介绍如何使用Spring Boot结合AOP实现轻松的日志管理。主要步骤包括:导入依赖、自定义注解、编写切面逻辑及在需要记录日志的方法上添加注解。通过这种方式可以有效地记录方法执行的时间、内容等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot 中日志管理用AOP如何轻松实现

1.项目中导入依赖

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

2.自定义注解

/**
 * 元注解:加在自定义注解上的注解
 * @Target 声明当前自定义注解 可以加在什么地方 TYPE类上
 * @Retention 声明当前自定义注解的生命周期(作用方法) RUNTIME 一直生效
 *
 * SOURCE 代表当前注解 在Java代码--->class过程中生效  其他环节不生效
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
    String type() default "select";

    String content();
}

3.写切面

package com.baizhi.aop;
import cn.hutool.http.server.HttpServerRequest;
import com.baizhi.annotation.LogAnnotation;
import com.baizhi.dao.BzLogMapper;
import com.baizhi.entity.BzAdmin;
import com.baizhi.entity.BzLog;
import com.baizhi.util.IPKit;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
@Aspect
@Configuration
public class LogAop {
    @Autowired
    private BzLogMapper logMapper;
    @Autowired
    private HttpServletRequest request;
    @Around("@annotation(com.baizhi.annotation.LogAnnotation)")
    public Object logAround(ProceedingJoinPoint joinPoint){
        /**
         * 1.获取日志数据
         */
        BzLog bzLog = new BzLog();

//        日期
        bzLog.setLogDate(new Date());

//        ip 通过工具类
        String ipAddrByRequest = IPKit.getIpAddrByRequest(request);
        bzLog.setLogIp(ipAddrByRequest);

//        session 用户名
        BzAdmin admin = (BzAdmin) request.getSession().getAttribute("admin");

        if (admin != null) {
            bzLog.setUsername(admin.getUsername());
        }else {
            bzLog.setUsername("hhh");
        }
        /**
         * 操作内容和类型
         * 难点:调用的方法不同 所需要获取到的类型和内容是不同的
         * 自定义注解(定义 类型和内容)
         * 通过切面获取自定义注解中的数据
         *
         * 获取目标方法上的注解 连接点对象
         */
//        1.获取方法签名对象
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//        2.通过方法签名对象获取方法对象
        Method method = signature.getMethod();
//        3.通过方法对象获取方法上的注解
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
        String type = annotation.type();
        bzLog.setLogType(type);
        bzLog.setLogContent(annotation.content());
//        获取方法名
        bzLog.setLogMethod(method.toString());
//        执行时间
        long startTime = System.currentTimeMillis();
        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        long endTime = System.currentTimeMillis();

        bzLog.setLogTime((int) (endTime-startTime));
        /**
         * 2.日志信息添加数据库
         */
        System.out.println(bzLog);
        logMapper.insert(bzLog);
        return result;
    }
}

4.在要记录日志的方法上添加注解

在这里插入图片描述

5.启动项目测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值