springboot3异步记录日志

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Spring AOP 简介

一、aop是什么


Spring AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在提高模块化,特别是关注点分离。它允许将横切关注点(如日志记录、事务管理、安全检查等)从业务逻辑中分离出来,从而提高代码的可维护性和复用性。

二、为什么使用 Spring AOP?
关注点分离:将业务逻辑与横切关注点分离,使代码更加清晰和模块化。
代码复用:横切关注点可以被多个业务模块重用,减少重复代码。
增强功能:通过切面(Aspect)可以在不修改原有代码的情况下,动态地增加新的功能。
简化开发:Spring AOP 提供了强大的工具和注解,使得 AOP 编程变得更加简单和直观。
如何在 Spring Boot 项目中使用 Spring AOP?
要在 Spring Boot 项目中使用 Spring AOP,首先需要在项目的 pom.xml 文件中添加 spring-boot-starter-aop 依赖。以下是具体的依赖配置:

二、使用步骤

1.引入依赖

代码如下(示例):

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

2.aop基于注解使用(这样更灵活定位接口)

代码如下(示例):

package com.xiaogung.logs.annotation;
import com.xiaogung.logs.domain.enums.BusinessTypeEnum;

import java.lang.annotation.*;

/**
 * 自定义操作日志记录注解
 * @author qrxm
 */
@Target(ElementType.METHOD) // 注解只能用于方法
@Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期
public @interface Log {

    String value() default "";
    /**
     * 模块
     */
    String title() default "测试模块";

    /**
     * 方法名称
     */
    String method() default "测试方法";

    /**
     * 功能
     */
    BusinessTypeEnum businessType() default BusinessTypeEnum.OTHER;
}

package com.xiaogung.logs.aop;

import com.xiaogung.logs.annotation.Log;
import com.xiaogung.logs.domain.po.SysLog;
import com.xiaogung.logs.listener.EventPubListener;
import com.xiaogung.logs.uilts.IpUtils;
import com.xiaogung.tool.domain.po.SysUser;
import com.xiaogung.tool.utils.JwtTokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


import java.util.Date;

@Aspect
@Component
@RequiredArgsConstructor
public class SysLogAspect {

    private final JwtTokenUtil jwtTokenUtil;

    private final Logger logger = LoggerFactory.getLogger(SysLogAspect.class);


    private final EventPubListener eventPubListener;

    /**
     * 以注解所标注的方法作为切入点
     */
    @Pointcut("@annotation(com.xiaogung.logs.annotation.Log)")
    public void sysLog() {}


    /**
     * 在切点之后织入
     * @throws Throwable
     */
    @After("sysLog()")
    public void doAfter(JoinPoint joinPoint) {
        Log log = ((MethodSignature) joinPoint.getSignature()).getMethod()
                .getAnnotation(Log.class);
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String method = request.getMethod();
        String url = request.getRequestURL().toString();
        String ip = IpUtils.getIpAddr(request);
        SysLog sysLog = new SysLog();
        sysLog.setBusinessType(log.businessType().getCode());
        sysLog.setTitle(log.title());
        sysLog.setMethod(log.method());
        sysLog.setRequestMethod(method);
        sysLog.setOperIp(ip);
        sysLog.setOperUrl(url);
        if(request.getHeader("Authorization")!=null){
            SysUser userInfo= jwtTokenUtil.getUserNameFromToken(request.getHeader("Authorization"));
            sysLog.setOperName(userInfo.getUserName());
        }
        sysLog.setOperTime(new Date());
        // 发布消息
        eventPubListener.pushListener(sysLog);
        logger.info("=======日志发送成功,内容:{}",sysLog);
    }
}

这里我没有使用异步
@Log(value = "用户登录",title = "用户登录",method = "POST",businessType = BusinessTypeEnum.SELECT)
@PostMapping("/login")
 @Operation(summary = "用户登录")
public Result login(@RequestBody SysUserDTO sysUserDTO){
    log.info("用户登录{}",sysUserDTO);
   loginVo s= sysUserService.login(sysUserDTO);
    return Result.SUCCESS(s);
}

展示结果

可以看到日志记录了在看看数据库

成功了是不是很简单信息所有人都可以


总结

如果没有成功看看是不是依赖冲突,解决办法修改依赖版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值