当前位置: 首页 > news >正文

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业务层代码。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计
  • 热力学计算网站使用推荐,Thermo-Calc!
  • Qt QTableWidget 去除序号列
  • 将tsx引入vue
  • JavaScript 逆向技巧总结
  • 进程信号的产生与处理
  • C语言编译和链接超详解
  • 【卡梅德生物】鼠单B细胞筛选技术及其在鼠单抗生产中的应用
  • 【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口
  • 【HBZ分享】Spring启动时核心refresh方法流程
  • 0022__gitbash中文乱码显示数字问题
  • SQL注入漏洞的防范措施
  • 为什么选择在Facebook投放广告?
  • 【数据结构与算法 | 哈希表篇】力扣387
  • 4.mysql约束
  • JavaScript-如何实现克隆(clone)函数
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 「面试题」如何实现一个圣杯布局?
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 2017-09-12 前端日报
  • ComponentOne 2017 V2版本正式发布
  • css属性的继承、初识值、计算值、当前值、应用值
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6系统学习----从Apollo Client看解构赋值
  • Javascript 原型链
  • Java应用性能调优
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • rc-form之最单纯情况
  • Sass 快速入门教程
  • windows下使用nginx调试简介
  • 闭包,sync使用细节
  • 初识MongoDB分片
  • 电商搜索引擎的架构设计和性能优化
  • 开源SQL-on-Hadoop系统一览
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据仓库的几种建模方法
  • 我的业余项目总结
  • 写代码的正确姿势
  • 函数计算新功能-----支持C#函数
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #{}和${}的区别是什么 -- java面试
  • #includecmath
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (~_~)
  • (2)STM32单片机上位机
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)pulsar安装在独立的docker中,python测试
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...