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 {@Autowiredprivate DataLogService dataLogService;@Autowiredprivate 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业务层代码。