1.自定义注解

@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface RptLog {
String value() default "";
}

2.aop相关的配置类

@Slf4j
@Aspect
@Component
public class RptOperateLogAspect { @Autowired
@SuppressWarnings("all")
private RptOperateLogMapper rptOperateLogMapper; @Autowired
private UserService userService;
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation(com.in.g.data.config.RptLog)")
public void logPoinCut() {
} //切面 配置通知
@AfterReturning("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
System.out.println("报表系统记录操作日志");
//保存日志
RptOperateLog rptOperateLog = new RptOperateLog(); //从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod(); //获取当前用户操作信息
Object[] args = joinPoint.getArgs();
if (ArrayUtils.isNotEmpty(args)){
Integer id = (Integer) args[0];
//记录操作用户的信息
SessionUserDTO user = userService.getUser(id);
rptOperateLog.setRole(user.getRoleName());
rptOperateLog.setUsername(user.getFullName());
rptOperateLog.setAccount(user.getUserName());
}
RptLog rptLog = method.getAnnotation(RptLog.class);
if (rptLog != null) {
String value = rptLog.value();
//操作名称
rptOperateLog.setOperateContent(value);
}
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//操作时间
rptOperateLog.setOperateTime(new Date());
//操作用户ip地址
rptOperateLog.setIpAddress(IpAddressUtil.getIpAddr(request));
//操作设备信息
String deviceInfo = AgentUserKit.getDeviceInfo(request);
rptOperateLog.setDevice(deviceInfo);
//保存操作日志
rptOperateLogMapper.saveLog(rptOperateLog);
log.info("报表日志保存成功 rptOperateLog:[{}]",rptOperateLog);
}
}

3.使用自定义注解

    @GetMapping("/customer_info")
@RptLog(value = "下载-客户详情报表")
public Result customerInfoExcelGenerate(@RequestHeader(CommonConstant.X_OPERATOR_ID) Integer loginId,
@Validated CustomerInfoDTO customerInfoDTO) {
iReportExcelRecordService.customerInfoExcelGenerate(loginId,customerInfoDTO);
return Result.success(null);
}

AOP记录日志的更多相关文章

  1. springboot使用@Aspect实现AOP记录日志讲解

    AOPAOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.在日常开发当中经常用来记录日志,方法跟踪 ...

  2. 浅谈AOP

    AOP,面向切面编程,作为OOP的一种补充,在处理一些系统共有的业务,比如日志,事务等,提供了一种比OOP更佳的解决方案. 在OOP中,控制的粒度为对象,因此,对象中也就参杂这不属于本身业务主体的一下 ...

  3. 来一手 AOP 注解方式进行日志记录

    系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...

  4. SpringBoot图文教程5—SpringBoot 中使用Aop

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  5. Struts2拦截器记录系统操作日志

    前言 最近开发了一个项目,由于项目在整个开发过程中处于赶时间状态(每个项目都差不多如此)所以项目在收尾阶段发现缺少记录系统日志功能,以前系统都是直接写在每个模块的代码中,然后存入表单,在页面可以查看部 ...

  6. ssm 项目记录用户操作日志和异常日志

    借助网上参考的内容,写出自己记录操作日志的心得!! 我用的是ssm项目使用aop记录日志:这里用到了aop的切点 和 自定义注解方式: 1.建好数据表: 数据库记录的字段有: 日志id .操作人.操作 ...

  7. Web调优之IBM JDK+liberty(一): Jmeter pod里压力,50个线程并发测试,调整 -Xms -Xms, Log原来是大问题

    1.运行环境 k8s Web服务器: Liberty(IBM J9 JDK),base image : FROM websphere-liberty:20.0.0.3-kernel-java8-ibm ...

  8. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  9. 使用Spring Aop自定义注解实现自动记录日志

    百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...

随机推荐

  1. JetSonNano darknet yolov3工程通过CMakeLists.txt配置编译环境

    CMakeLists.txt 写的比较糙,有疑问欢迎咨询. option(GPU ON) option(CUDNN ON) option(OPENCV ON) cmake_minimum_requir ...

  2. ELK整合Filebeat监控nginx日志

    ELK 日志分析 1. 为什么用到 ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep. awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如 ...

  3. 【PowerOJ1742&网络流24题】试题库问题(最大流)

    题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...

  4. 12 November

    [SCOI2005] Mine BZOJ 1088: 相信大家都玩过扫雷的游戏.那是在一个 n×m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了 ,"余"人国流行起了一种 ...

  5. Ecipse代码调试

    1.设置断点 2.启动调试 在代码空白处中右击,选择Debug as —>1 Java Application 快捷键 表示当前实现继续运行直到下一个断点,快捷键为F8. 表示打断整个进程 表示 ...

  6. ES6 模板语法和分隔符

    let user = 'Barret'; console.log(`Hi ${user}!`); // Hi Barret!

  7. javascript中for循环和标签元素赋值问题总结

    <!DOCTYPE html><html><body><p>点击下面的按钮,将代码块循环五次:</p><button onclick= ...

  8. PEP8中文版 -- Python编码风格指南

    Python部落组织翻译, 禁止转载 目录      缩进      制表符还是空格?      行的最大长度      空行      源文件编码      导入      无法忍受的      其 ...

  9. 纯CSS3写一个立方体并在鼠标悬停的时候无限循环旋转

  10. tensorflow 关于 矩阵 运算 + 符号得含义。 2维 数组 + 1纬数组, 就是每一行都 加一边 1纬数组。 呵呵

    小锋子Shawn(403568338)  13:51:23mnist.training.images?墨须(964489899)  13:51:27我的图片是100*100的,该怎么兼容.  小锋子S ...