springboot-切面日志

springboot-切面日志

当使用AOP实现日志记录功能时,需要进行以下步骤:

创建切面类 BussinessLogAspect:


```java
@Slf4j
@Aspect
@Component
public class BussinessLogAspect {

    @Autowired
    private SysLogService logService;

    // 定义切点,指定被 @BussinessLog 注解标记的方法为切点
    @Pointcut(value = "@annotation(com.zyd.blog.business.annotation.BussinessLog)")
    public void pointcut() {
    }

    // 环绕通知,在方法执行前后执行
    @Around("pointcut()")
    public Object writeLog(ProceedingJoinPoint point) throws Throwable {
        // 先执行业务方法
        Object result = point.proceed();

        try {
            handle(point);  // 处理日志记录
        } catch (Exception e) {
            log.error("日志记录出错!", e);
        }

        return result;
    }

    // 处理日志记录
    private void handle(ProceedingJoinPoint point) throws Exception {
        // 获取目标方法对象
        Method currentMethod = AspectUtil.INSTANCE.getMethod(point);

        // 获取操作名称和其他注解属性值
        BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class);
        boolean save = annotation.save();
        PlatformEnum platform = annotation.platform();
        String bussinessName = AspectUtil.INSTANCE.parseParams(point.getArgs(), annotation.value());
        String ua = RequestUtil.getUa();

        // 在控制台打印日志
        log.info("{} | {} - {} {} - {}", bussinessName, RequestUtil.getIp(), RequestUtil.getMethod(), RequestUtil.getRequestUrl(), ua);

        if (!save) {
            return;
        }

        // 保存日志到数据库
        logService.asyncSaveSystemLog(platform, bussinessName);
    }
}

创建自定义注解 @BussinessLog:

```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BussinessLog {
    String value() default "";  // 操作名称
    boolean save() default false;  // 是否保存日志到数据库
    PlatformEnum platform() default PlatformEnum.UNKNOWN;  // 平台类型
}

在目标方法上添加 @BussinessLog 注解,并指定相应属性值:

@Service
public class UserService {

    @BussinessLog(value = "用户登录", save = true, platform = PlatformEnum.WEB)
    public void login(String username, String password) {
        // 用户登录逻辑
        // ...

        // 在方法内部打印日志
        log.info("用户登录成功,用户名: {}", username);
    }
}

在上述代码中,我们在 UserService 类的 login 方法上添加了 @BussinessLog 注解,并指定了操作名称为 “用户登录”,将日志保存到数据库,并指定平台类型为 PlatformEnum.WEB。在方法内部,我们通过 log.info() 方法打印了一条日志,记录了用户登录成功的信息。

当调用 UserService 的 login 方法时,AOP切面会拦截该方法的执行,在方法执行前后记录日志,并根据注解的配置决定是否将日志保存到数据库。
[1]: http://www.lgzcloud.top/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值