spring boot aop 实践---记录日志

简介: spring boot aop 实践---记录日志

一、controller方法加切面,记录操作日志

其他应用:记录方法耗时 ljheee/my-monitor-aop (github.com)

1.pom文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

2.注解类

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnno {
    String Type();
}

3.切面类

package com.vince.aop;
import com.vince.annotation.LogAnno;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import java.lang.reflect.Method;
/**
 * @author duanxiaoqiu
 * @Date 2019-12-03 09:52
 **/
@Slf4j
@Component
@Aspect
public class LogAopAspect {
    //表示匹配带有自定义注解的方法
    @Pointcut("@annotation(com.vince.annotation.LogAnno)")
    public void pointcut() {}
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) {
        Object result =null;
        long beginTime = System.currentTimeMillis();
        try {
            log.info("我在目标方法之前执行!");
            result = point.proceed();
            long endTime = System.currentTimeMillis();
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            // 获取方法
            Method method = methodSignature.getMethod();
            // 获取方法上面的注解
            LogAnno logAnno = method.getAnnotation(LogAnno.class);
            // 获取操作描述的属性值
            String operateType = logAnno.Type();
            log.info("我在目标方法之后执行!");
        } catch (Throwable e) {
            // TODO Auto-generated catch block
        }
        return result;
    }
}

4.应用

@LogAnno(Type = "添加用户")
@RequestMapping("/")
@ResponseBody
public String index() {
    log.info("=======1=======" + userName);
    return "hello world";
}

二、在controller上加切面

package com.vince.aop;
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.springframework.stereotype.Component;
/**
 * @author duanxiaoqiu
 * @Date 2019-12-03 10:12
 **/
@Slf4j
@Aspect
@Component
public class LogAspect {
    /**
     * Pointcut定义切点
     * public修饰符的   返回值任意  com.vince.controller包下面的任意类的任意方法任意参数
     */
    @Pointcut("execution(public * com.vince.controller.*.*(..))")
    public void log(){
    }
    @Around("log()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Object result =null;
        long beginTime = System.currentTimeMillis();
        try {
            log.info("我在目标方法之前执行!");
            log.info("class.method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
            log.info("args: "+joinPoint.getArgs());
            result = joinPoint.proceed();
            log.info("我在目标方法之后执行!");
        } catch (Throwable e) {
            // TODO Auto-generated catch block
        }
        return result;
    }
    /*@Before("log()")
    public void doBefore(JoinPoint joinPoint){
        log.info("方法执行前...");
        log.info("class.method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("args: "+joinPoint.getArgs());
    }
    @After("log()")
    public void doAfter(JoinPoint joinPoint){
        log.info("方法执行后...");
    }
    @AfterReturning(returning="result", pointcut="log()")
    public void doAfterReturnint(Object result){
        log.info("方法返回值:" + result);
    }*/
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
XML Java UED
使用 Spring Boot 实现重试和补偿功能:从理论到实践
【6月更文挑战第17天】在分布式系统中,服务之间的调用可能会因为网络故障、服务器负载等原因偶尔失败。为了提高系统的可靠性和稳定性,我们经常需要实现重试和补偿功能。
33 6
|
5天前
|
XML 缓存 Java
Spring Boot 优雅实现降级功能:Hystrix 与 Resilience4j 的实践
【6月更文挑战第19天】在分布式系统中,服务降级是一种重要的容错机制。当某个服务不可用或响应慢时,降级机制可以保证系统的整体稳定性。本文将详细介绍如何在 Spring Boot 中使用 Hystrix 和 Resilience4j 实现降级功能。
29 7
|
6天前
|
NoSQL 算法 Java
使用 Spring Boot 实现限流功能:从理论到实践
【6月更文挑战第18天】在微服务和高并发系统中,限流(Rate Limiting)是一种非常重要的技术手段,用于保护系统免受过载,确保服务的稳定性。限流可以控制请求的速率,防止单个客户端或恶意用户消耗过多的资源,从而影响其他用户。
16 5
|
3天前
|
监控 Java API
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
15 1
|
4天前
|
缓存 监控 安全
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
16 1
|
5天前
|
运维 安全 Java
SpringBoot运维篇(打包,多环境,日志)
SpringBoot运维篇(打包,多环境,日志)
|
10天前
|
监控 Java Spring
自定义注解+AOP切面日志+源码
自定义注解+AOP切面日志+源码
16 1
|
16天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
11 1
|
4天前
|
Java API
SpringBoot系列之切换log4j日志框架
SpringBoot系列之切换log4j日志框架
6 0
|
4天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的“返家乡”高校暑期社会实践微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的“返家乡”高校暑期社会实践微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)