AOP实现日志记录

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

AOP实现日志记录
自定义注解方式 实现

1、总体图

AOP实现日志记录,intellij-idea,AOP,spring boot
2、注解类SystemLog

SystemLog
AOP实现日志记录,intellij-idea,AOP,spring boot

package com.sangeng.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) //@SystemLog注解 保持到 runtime阶段
@Target({ElementType.METHOD})   //指定@SystemLog注解 加在method上,表示某个method受aop切面增强
public @interface SystemLog {
    //使用aop,1.写  自定义注解 @SystemLog
    String businessName(); //属性,指定业务名称 “更新用户信息”
}

3、切面类LogAspect
handleBefore 在请求执行之前 执行这个方法
handleAfter 在请求执行之后 执行这个方法
AOP实现日志记录,intellij-idea,AOP,spring boot

LogAspect

package com.sangeng.aspect;
import com.alibaba.fastjson.JSON;
import com.sangeng.annotation.SystemLog;
import lombok.extern.slf4j.Slf4j;
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 org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

@Component //切面类要注入spring容器
@Aspect    //告诉spring这是 一个切面类
@Slf4j  // log日志
public class LogAspect {
    //使用aop,2. 定义切面类LogAspect
//切面 = 切点 + 通知

    // 2.1确定切点(重点:在方法上加注解,指定切点)  注解方式(写自定义注解@SystemLog的全类名)
    @Pointcut("@annotation(com.sangeng.annotation.SystemLog)") //自定义注解SystemLog的 全类名
    public void pt(){
//    被增强方法,目标方法:controller中 @PutMapping("/userInfo")对应的方法
//joinPoint:被增强方法(目标方法)的信息 封装成一个对象
    }

    // 2.2通知方法 (增强的代码)
    @Around("pt()")  //环绕通知:指定使用的切点---指定pt()方法上所使用的切点
    public Object printLog(ProceedingJoinPoint joinPoint) throws Throwable { //joinPoint:被增强方法(目标方法)的信息 封装成一个对象
//        环绕通知是前置,执行,异常,最终四个通知

        Object ret; //Around必须调用proceed()让目标方法执行,不然目标方法不会执行
        try {
            handleBefore(joinPoint);//目标方法之前 执行
            ret = joinPoint.proceed();  //这个异常,这里不能用try-catch,否则controller层的异常都在这被捕获了,so,要往上抛出异常
            handleAfter(ret); //目标方法之后 执行    参数ret是目标方法执行后返回ResponseResult类型
        } finally { //最终 都要执行的代码:打印日志信息
            // 结束后换行
            log.info("=======End=======" + System.lineSeparator()); //System.lineSeparator()获取当前系统换行符
        }
        return ret; //目标方法执行后,要有返回值,不然目标方法没有返回值
    }
    private void handleBefore(ProceedingJoinPoint joinPoint) {
//        看到类名后面有Holder 一般表示这个类 使用ThreadLocal进行数据共享,保证多个线程之间资源的隔离
//        RequestAttributes -> ServletRequestAttributes(实现类) 可以获取request
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest(); //得到request

        //获取被增强方法上的注解对象  被增强方法:controller中 @PutMapping("/userInfo")对应的方法
        SystemLog systemLog = getSystemLog(joinPoint); // 需要joinPoint对象

        log.info("=======Start=======");
        // 打印请求 URL
        log.info("URL            : {}",request.getRequestURL()); //获取当前线程请求对象, url是在request对象当中(URL在http报文的request部分)
        // 打印描述信息  业务名字,接口名字
        log.info("BusinessName   : {}", systemLog.businessName());
        // 打印 Http method
        log.info("HTTP Method    : {}", request.getMethod());
        // 打印调用 controller 的全路径以及执行方法   类名 方法名
        log.info("Class Method   : {}.{}",joinPoint.getSignature().getDeclaringType(),
                ((MethodSignature) joinPoint.getSignature()).getName());
        // 打印请求的 IP
        log.info("IP             : {}",request.getRemoteHost());
        // 打印请求入参
        log.info("Request Args   : {}", JSON.toJSONString(joinPoint.getArgs())); //数组转成json字符串
    }

    private void handleAfter(Object ret) {
        // 打印出参
        log.info("Response       : {}",JSON.toJSONString(ret) );
    }

    private SystemLog getSystemLog(ProceedingJoinPoint joinPoint) {
//    被增强方法,目标方法:controller中 @PutMapping("/userInfo")对应的方法
//joinPoint:被增强方法(目标方法)的信息 封装成一个对象,叫做签名Signature
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取目标方法
        SystemLog systemLog = signature.getMethod().getAnnotation(SystemLog.class);
        return systemLog;
    }

}

4、测试
运行项目,访问 @PutMapping(“/user/userInfo”) 即可打印日志信息。
这个请求之前的日志 -> handleAfter
这个请求之后的日志 -> handleBefore文章来源地址https://www.toymoban.com/news/detail-624385.html

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

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

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

相关文章

  • 如何在Intellij-idea如何编译maven工程

    在 IntelliJ IDEA 中编译 Maven 工程,你需要遵循以下步骤: 打开 IntelliJ IDEA :首先,启动 IntelliJ IDEA。 打开 Maven 项目 :在欢迎界面上,选择 \\\"Get from Version Control\\\",然后选择你的 Maven 项目的仓库地址。或者,如果你已经有了项目文件(如  .idea  和  pom.xml ),你可以直接打开这

    2024年01月18日
    浏览(63)
  • Java开发+Intellij-idea+Maven+工程构建

    Intellij-idea是一款流行的Java集成开发环境,它支持Maven作为项目管理和构建工具。Maven可以帮助开发者自动下载项目依赖的jar包,执行编译、测试、打包等生命周期任务。本资源将介绍如何在Intellij-idea中创建、导入、转换和编译Maven工程,以及如何配置Maven的相关参数和插件。

    2024年02月01日
    浏览(70)
  • spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

    使用FieldMeta自定义注解,看个人业务自行觉得是否需要重新定义实体 实现类 :通过该实现类获取更新前后的数据。 该实现类的实现原理为:获取入参出入的id值,获取sqlSessionFactory,通过sqlSessionFactory获取selectByPrimaryKey()该方法,执行该方法可获取id对应数据更新操作前后的数

    2024年01月23日
    浏览(41)
  • Spring Boot + Aop 记录用户操作日志

    本文主要介绍通过Aop记录用户操作日志,这也是目前比较常用的用法,由于水平有限,所以可能存在错漏之处,望指正。 对应实体类为 SysOperLog.java MyLog.java BusinessType.java — 操作类型枚举类 LogAspect.java 用户操作日志是AOP最常见的一种业务场景,这里只是简单记录了少量信息,

    2024年02月06日
    浏览(38)
  • Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)附截图

    编译器及版本 idea-ultimate 依赖管理工具 maven Step1:点击右侧的maven Step2:右键依赖项,点击分析依赖关系 Step3:可以在模块名位置进行切换,左侧三角的标志则表示该包引入了多个版本,有冲突 Step4:可以看到当前这个包被引入了两个版本的 Step5:右键冲突的包名,可以看到

    2024年02月15日
    浏览(74)
  • Spring Boot入门(23):记录接口日志再也不难!用AOP和自定义注解给Spring Boot加上日志拦截器!

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(44)
  • AOP实现日志记录

    AOP实现日志记录 自定义注解方式 实现 1、总体图 2、注解类SystemLog SystemLog 3、切面类LogAspect handleBefore 在 请求执行之前 执行这个方法 handleAfter 在 请求执行之后 执行这个方法 LogAspect 4、测试 运行项目,访问 @PutMapping(“/user/userInfo”) 即可打印日志信息。 这个请求之前的日志

    2024年02月14日
    浏览(29)
  • Java使用Aop实现用户操作日志记录(新手入门)

    导入打印日志,aop,hutool,的依赖,Hutool是一个Java工具包,里面封装了大量的常用工具类,到时候咱们就通过这个工具包中有一个工具类可以用来获取客户端IP地址。 自定义操作类型枚举类 因为基本是增删改查四个方法 自定义用来记录用户操作日志的注解 写一个方法加上我

    2024年02月06日
    浏览(35)
  • Spring Boot入门(23):基于AOP实现自定义注解拦截接口日志并保存入库 | 超级详细,建议收藏

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(35)
  • AOP案例-记录日志操作

    目录 案例 操作日志 思路分析 步骤 准备 编码 将案例中的增删改接口的操作日志记录到数据表中 操作日志 日志信息包括:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时的参数、返回值、犯法运行时长。 思路分析 需要对于所有业务类中的增删改查方法统

    2024年02月09日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包