java自定义日志注解

1,创建Log注解


import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    String accessType() default "";
}

2,创建线程类(在方法执行之后单独起一个线程执行)


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadPoolManager {
    // 线程池对象
    private final ExecutorService executorService;

    // 构造函数,初始化线程池
    private ThreadPoolManager(int poolSize) {
        // 使用Executors工厂类来创建一个固定大小的线程池
        this.executorService = Executors.newFixedThreadPool(poolSize);
    }


    public static final ThreadPoolManager poolManager = new ThreadPoolManager(5);

    // 提交任务到线程池
    public void executeTask(Runnable task) {
        executorService.execute(task);
    }

    // 关闭线程池
    public void shutdown() {
        // 关闭线程池,不再接受新任务,但已提交的任务会继续执行
        executorService.shutdown();
        try {
            // 等待一定时间让已提交的任务完成执行
            if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                // 超时后强制关闭
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            // 如果等待过程中线程被中断,则也尝试强制关闭
            executorService.shutdownNow();
            // 保留中断状态
            Thread.currentThread().interrupt();
        }
    }

    // 获取线程池的当前状态
    public String getStatus() {
        if (executorService.isShutdown()) {
            return "Shutdown";
        } else if (executorService.isTerminated()) {
            return "Terminated";
        } else {
            return "Active";
        }
    }
}

3,实现Aspect


import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneId;

@Aspect
@Component
public class LogAspect {

    @Autowired
    private DataLogService dataLogService;

    @Autowired
    private AccessDynamicLogService accessDynamicLogService;
    //正常
    @AfterReturning(pointcut = "@annotation(log)")
    public void doAfterReturning(Log log) {
        if (StringUtils.isNoneBlank(log.accessType())) {
            AccessDynamicLog accessLog = new AccessDynamicLog();
            accessLog.setAccessType(log.accessType());
            accessLog.setCreator(ThreadLocalUtil.get("username").toString());
            accessLog.setCreateId(ThreadLocalUtil.get("userId").toString());
            accessLog.setCreateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
            accessLog.setDeptId(ThreadLocalUtil.get("deptId").toString());
            accessLog.setIp(ThreadLocalUtil.get("userIp").toString());
            accessLog.setStatus(AccessStatusEnum.ACCESS_SUCCESS);
            ThreadPoolManager.poolManager.executeTask(() -> accessDynamicLogService.addLog(accessLog));
        }
    }
    //异常
    @AfterThrowing(pointcut = "@annotation(log)")
    public void doAfterThrowing(Log log) {
        if (StringUtils.isNoneBlank(log.accessType())) {
            AccessDynamicLog accessLog = new AccessDynamicLog();
            accessLog.setAccessType(log.accessType());
            accessLog.setCreator(ThreadLocalUtil.get("username").toString());
            accessLog.setCreateId(ThreadLocalUtil.get("userId").toString());
            accessLog.setCreateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
            accessLog.setDeptId(ThreadLocalUtil.get("deptId").toString());
            accessLog.setIp(ThreadLocalUtil.get("userIp").toString());
            accessLog.setStatus(AccessStatusEnum.ACCESS_FAIL);
            ThreadPoolManager.poolManager.executeTask(() -> accessDynamicLogService.addLog(accessLog));
        }
    }
}

4,具体的业务impl业务处理

然后写你的impl业务层代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值