使用Spring AOP实现方法入参日志打印/请求响应日志打印

在实际的项目中对外暴露的接口通常需要打印请求日志,以下就是使用切面做一个请求日志打印的功能:
首先先导入AOP相关的包,SpringBoot的项目启动类需要添加@EnableAspectJAutoProxy 注解

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

注解类:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogParam {
}

切面类:

@Aspect
@Component
public class MethodLogParam {
    private final Logger logger = LoggerFactory.getLogger(MethodLogParam.class);

    @Pointcut("@annotation(com.term.spring_batch.annotation.LogParam)")
    public void logPointCut() {
    }

    @Before("logPointCut()")
    public void before(JoinPoint joinPoint) {
        try {
            String methodName = joinPoint.getSignature().getName();
            logger.info("请求{}.{}入参日志:【{}】", joinPoint.getTarget().getClass(), methodName, joinPoint.getArgs());
        } catch (Exception e) {
            logger.error("入参日志打印异常", e);
        }
    }
}

目标类:

@Service
public class AopService {

    private  final Logger logger = LoggerFactory.getLogger(AopService.class);
    @Autowired
    private UserMapper userMapper;
	// 在需要打印日志的方法上添加日志打印的注解
    @LogParam
    public int insertBatchData(List<User> userList) {
        int count = 0;
        for (User user : userList) {
            try {
                // 使用AOP的方式调用本类方法
                count += ((AopService) AopContext.currentProxy()).insertOneData(user);
            } catch (Exception e) {
                // 发生异常只记录日志不阻断程序
                logger.error("数据插入异常", e);
            }
        }
        return count;
    }

测试类:(随便写个Spring测试类或者启动项目测试都行)

@SpringBootTest
@RunWith(SpringRunner.class)
public class AopServiceTest {
    @Autowired
    private AopService aopService;
    @Test
    public void testInsertBatch() {
        int result = aopService.insertBatchData(Arrays.asList(creatUser("张三"), creatUser("李四"), creatUser("王五")));
        System.out.println("数据库更新的条目数为 "+result);
    }

    // 生成实体类对象
    private User creatUser(String name) {
        User user = new User();
        user.setName(name);
        user.setAge((int) (Math.random() * 80));
        user.setEmail("shabi@111.com");
        return user;
    }
}

日志:

2021-11-28 18:32:17.719  INFO 3112 --- [           main] c.t.spring_batch.aspect.MethodLogParam   : 请求class com.term.spring_batch.service.AopService.insertBatchData入参日志:【[[User{id=null, name='张三', age=64, email='shabi@111.com'}, User{id=null, name='李四', age=76, email='shabi@111.com'}, User{id=null, name='王五', age=56, email='shabi@111.com'}]]】

以上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪力乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值