1、springboot中使用AOP切面完成全局日志

这篇具有很好参考价值的文章主要介绍了1、springboot中使用AOP切面完成全局日志。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、springboot中使用AOP切面完成全局日志

可选择在控制台输出日志或者收集日志信息存储进数据库中

1、在配置 AOP 切面之前,我们需要了解下 aspectj 相关注解的作用:

  • @Aspect:作用是把当前类标识为一个切面、供容器读取
  • @Pointcut:(哪些方法或者类需要进行AOP织入)定义一个切点,后面跟随一个表达式,表达式可以定义为某个 package 下的方法,也可以是自定义注解等;
  • 切点定义好后,就是围绕这个切点做文章了:
    • @Before: 在切点之前,织入相关代码;
    • @After: 在切点之后,织入相关代码;
    • @AfterReturning: 在切点返回内容后,织入相关代码,一般用于对返回值做些加工处理的场景;
    • @AfterThrowing: 用来处理当织入的代码抛出异常后的逻辑处理;
    • @Around: 在切入点前后织入代码,并且可以自由的控制何时执行切点;

2、导入依赖

注:第二个依赖可选择不用,本质就是将数据 JSON 化、使用阿里的也行(后期出错再改)

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

        <!-- 用于日志切面中,以 json 格式打印出入参(本来使用阿里的 FASTJSON, 但是对于文件上传的接口,打印参数会报错,换为 Gson) -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

3、配置文件中声明

注:可不用声明,默认开启且使用的是 JDK(即接口方式的动态代理,如果需要使用类的动态代理就需要将proxy-target-class: true设置为true,默认是false)

这里其实不需要进行下面的配置,只是提一下

#spring配置
spring:
  #切面启用
  aop:
    proxy-target-class: true
    auto: true

4、编写全局日志处理

定义一个类,类名为:WebLogAspect(可任意取)

注:下面只是实现了在控制台打印日志信息,我们在末尾可添加一个插入方法,插入此次收获的所有信息存储进日志表中

同时,最好只插入增删改三者,因其涉及对数据的变动,查询不会变动数据可忽略(不然日志信息太多)

其次,此实现只AOP类控制层的方法,其他层也可照此。

package com.zou.config;


import com.google.gson.Gson;
import io.swagger.annotations.ApiOperation;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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 javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class WebLogAspect {

    // 获取日志类,方便直接在控制台输出统一格式的日志信息
    private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
	
    /*
    方式1:controller包下所有类中的开头带有insert的方法
    	@Pointcut("execution(public * com.zou.controller.*.insert*(..))")
    方式2:
		@Pointcut("execution(public * com.ldb.admin.controller.*.create*(..))||" +
            "execution(public * com.ldb.admin.controller.*.update*(..))||" +
            "execution(public * com.ldb.admin.controller.*.delete*(..))")
    	注:可使用 || &&
     * 1)execution(public * (..))——表示匹配所有public方法
     * 2)execution( set(..))——表示所有以“set”开头的方法
     * 3)execution( com.xyz.service.AccountService.(..))——表示匹配所有AccountService接口的方法
     * 4)execution( com.xyz.service..(..))——表示匹配service包下所有的方法
     * 5)execution(* com.xyz.service...(..))——表示匹配service包和它的子包下的方法
     */
    
    /** 以 controller 包下定义的所有请求为切入点 */
    @Pointcut("execution(public * com.zou.controller.*.*(..))")
    public void webLog() {}

    /**
     * 在切点之前织入
     * @param joinPoint
     * @throws Throwable
     */
    @Before("webLog()") // webLog():是你@Pointcut注解的方法名
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 开始打印请求日志
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // 打印请求相关参数
        logger.info("========================================== Start ==========================================");
        // 打印请求 url
        logger.info("URL            : {}", request.getRequestURL().toString());
        // 打印 Http method
        logger.info("HTTP Method    : {}", request.getMethod());
        // 打印调用 controller 的全路径以及执行方法
        logger.info("Class Method   : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
        // 打印请求的 IP
        logger.info("IP             : {}", request.getRemoteAddr());
        // 打印请求入参
        logger.info("Request Args   : {}", new Gson().toJson(joinPoint.getArgs()));

        // 获取 @ApiOperation("") 注解中的信息,此注解属于swagger的,但也能获取,其他注解可举一反三
        ApiOperation apiOperation = null;
        
        // JoinPoint:oinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象.大概就是获取目标方法的一些信息
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        apiOperation = ms.getMethod().getDeclaredAnnotation(ApiOperation.class);
        if (apiOperation != null) { ;
            logger.info("操作   : {}", apiOperation.value());
        }
    }

    /**
     * 在切点之后织入
     * @throws Throwable
     */
    @After("webLog()")
    public void doAfter() throws Throwable {
        logger.info("=========================================== End ===========================================");
        // 每个请求之间空一行
        logger.info("");
    }

    /**
     * 环绕
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        // 打印出参
        logger.info("Response Args  : {}", new Gson().toJson(result));
        // 执行耗时
        logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
        return result;
    }


}


JoinPoint

常用API
方法名	功能
Signature getSignature();	获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs();	获取传入目标方法的参数对象
Object getTarget();	获取被代理的对象
Object getThis();	获取代理对象

ProceedingJoinPoint对象

ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中,
添加了以下两个方法。文章来源地址https://www.toymoban.com/news/detail-431824.html

Object proceed() throws Throwable //执行目标方法 
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法 

到了这里,关于1、springboot中使用AOP切面完成全局日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 使用【AOP 切面+注解】实现在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果

    在项目中需要实现 在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果 。 我们可以使用 AOP 切面+注解的形式实现。这样我们就可以在不修改原始代码的情况下,通过切面类在方法调用前后插入额外的逻辑。 自定义注解 @PreProcess 自定义注解 @PreProcess 用于

    2024年03月20日
    浏览(45)
  • 认识 spring AOP (面向切面编程) - springboot

    本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 AOP: 面向切面编程,也就是面向某一类编程,对某一类事情进行统一处理; spring AOP: 是实现了AOP这种思想的一

    2024年02月14日
    浏览(50)
  • 使用SpringBoot AOP记录操作日志和异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能;我们在操作某些功 能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 生的异常进行统计,从而改进我们的项目,要

    2024年02月04日
    浏览(43)
  • SpringBoot作日志切面记录

    目录 1.WebLogAspect 2.配置log4j2.yml 3.效果 话不多说,直接上代码:  1.WebLogAspect         在上面的代码示例中,我们定义了一个 WebLogAspect 切面,并通过 @Pointcut 注解指定了切点为所有 com.example.controller 包下的公共方法。在切面中,我们使用了 @Before 注解来记录请求信息,在

    2024年02月08日
    浏览(40)
  • Springboot切面打印日志

    切面打印完整日志,以下代码用于扫描@RestController 注解修饰的接口,并打印相关日志

    2024年02月14日
    浏览(35)
  • 一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码) 一张思维导图带你学会Springboot创

    2024年02月13日
    浏览(52)
  • 【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

    【JavaEE】 AOP(1) 1.1 AOP 与 Spring AOP AOP ( A spect O riented P rogramming),是一种思想,即 面向切面编程 Spring AOP 则是一个框架,Spring项目中需要引入依赖而使用 AOP和Spring AOP的关系就相当于IoC和DI Spring AOP让开发者能够半自动的开发AOP思想下实现的功能 1.2 没有AOP的世界是怎样的

    2024年02月11日
    浏览(46)
  • JAVA:使用 Spring AOP 实现面向切面编程

    1、简述 在现代的软件开发中,面向切面编程(AOP)是一种重要的编程范式,它允许我们将横切关注点(如日志记录、性能监控、事务管理等)从应用程序的核心业务逻辑中分离出来,以提高代码的模块化和可维护性。Spring 框架提供了强大的 AOP 支持,使得我们可以轻松地实

    2024年04月13日
    浏览(45)
  • 【Spring】javaBean、依赖注入、面向切面AOP、使用注解开发

    有一定规范的Java实体类,类内提供了一些公共方法以便外界对该对象的内部属性进行操作 所有属性都是private,所有的属性都可以通过get/set方法进行访问,同时还需要有一个无参构造(默认就有) 高内聚,低耦合是现代软件的开发的设计模式 之前编写的图书管理系统具有高

    2024年02月08日
    浏览(85)
  • 如何将重复方法封装为Aop切面并结合注解使用

    首先要导入依赖 编写注解 编写Aop 方法上添加注解   然后测试就发现添加代码的方法都可以防止重复提交了!!

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包