当前位置: 首页 > news >正文

自定义Springboot Aop异步写入日志

pom 依赖

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

自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
    int type() default 0;
}

自定义LogAspect

package com.admin.utils.log.aspect;

import com.admin.utils.ip.IpUtils;
import com.admin.utils.log.aop.Log;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * @author kuaiting
 */

@Component
@Slf4j
@Aspect
public class LogAspect {


	private long startTime;

	/**
	 * <p> 切点声明
	 */
	@Pointcut("execution(* com.admin.controller.*.*(..))")
	public void pointcut() { }

	@Before(value = "pointcut()")
	public void doBefore(JoinPoint joinPoint) {
        startTime=    System.currentTimeMillis();
		ServletRequestAttributes servletRequestAttributes
				= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = servletRequestAttributes.getRequest();

		StringBuffer requestURL = request.getRequestURL();
		log.info("请求url:{}", requestURL);
		String ip = IpUtils.getIpAddr(request);
        log.info("请求IP:{}",ip);
		// 获取请求参数
		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
		Method method = signature.getMethod();
        log.info("请求方式:{}",method);
		Log aopLog = method.getAnnotation(Log.class);
		// 用户代理(客户端)
		String userAgent = request.getHeader("User-Agent");
		// 方法路径

		//String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
        //log.info("请求执行的目标方法:{}",methodName);
		StringBuilder params = new StringBuilder("{");
		//参数值
		Object[] argValues = joinPoint.getArgs();
		//参数名称
		String[] argNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
		if (argValues != null) {
			for (int i = 0; i < argValues.length; i++) {
				params.append(" ").append(argNames[i]).append(": ").append(argValues[i]);
			}
		}
		params.append("}");
		// 设置请求参数
        log.info("请求参数:{}",params.toString());
	}

    @Async(value = "asyncExecutor")
	@AfterReturning(pointcut = "pointcut()", returning = "returnedValue")
	public void doAfterReturning(Object returnedValue) {
		long time = System.currentTimeMillis() - this.startTime;
        log.info("请求耗时:{}秒",time);
        log.info("请求返回值:{}",returnedValue);
	}

    @Async(value = "asyncExecutor")
	@AfterThrowing(pointcut = "pointcut()", throwing = "throwable")
	public void doAfterThrowing(Throwable throwable) {
        log.info("请求异常信息:{}",throwable.getMessage());
        throwable.printStackTrace();

	}


}

执行效果

在这里插入图片描述

相关文章:

  • Ckeditor5 富文本
  • AOP篇:场景模拟、提出问题引入代理模式、(静态和动态代理的实现)
  • 【力扣刷题】Day06——哈希表专题
  • 信息检索复习
  • 达梦数据库超出全局hash join空间(超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE的错误)
  • 产品设计:《广告设计与创意》
  • vue/cli4.x vue.config.js 配置插件
  • <Linux复习>gdb调试工具
  • java基于安卓Android微信小程序的的桃源婚恋交友APP
  • ArchLinux 更换系统语言安装搜狗输入法
  • 什么是云原生?以及应用落地
  • VSCode 安装Flutter 教程
  • Mkdoc使用--The “glightbox“ plugin is not installed
  • Windows——CreatFile使用
  • 指针初阶详解
  • 使用交换函数来实现变量的修改以及指针指向的修改
  • 报时机器人的rasa shell执行流程分析
  • T1084 幂的末尾(信息学一本通C++)
  • 【Linux】Tomcat简介及二进制安装
  • 老杨说运维 | 企业数字化运维转型趋势解读
  • 2022全国车辆工程专业大学排名一览表
  • 2022周口职业技术学院单招学费多少钱一年-各专业收费标准
  • 2022年中原工学院艺术类招生简章
  • 2022浙江经贸职业技术学院学费多少钱一年-各专业收费标准
  • 2022年湖南大学强基计划报名条件-报名时间-报名入口
  • 2020河北工程大学运动训练专业招生简章
  • 2022湖州有哪些民办大学?湖州所有民办大学名单一览表(1所)
  • 2022天津城市建设管理职业技术学院学费多少钱一年-各专业收费标准
  • 2022滁州学院艺术类学费多少钱一年-各专业收费标准
  • 2022云南警官学院学费多少钱一年-各专业收费标准