简易的用户操作日志记录
时间:2019-10-17
本文章向大家介绍简易的用户操作日志记录,主要包括简易的用户操作日志记录使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
记录系统内用户的操作日志。
1.日志类
public class SysLog { /** * 主键 */ private String id; /** * 操作开始时间 */ private Date createTime; /** * 操作结束时间 */ private Date endTime; /** * 执行耗时 */ private long excuteTime; /** * 接口地址 */ private String url; /** * 请求参数 */ private String params; /** * 操作结果代码 */ private String code; /** * 接口名 */ private String targetName; /** * 接口方法 */ private String methodName; /** * 业务类型 */ private String businessType; /** * 操作名称 */ private String operationName; /** * 异常原因 */ private String reason; /** * 请求ip */ private String ip; /** * 操作人userid */ private String userId; /** * 操作人名称 */ private String userName; public String getId() { return id; } public void setId(String id) { this.id = id; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getTargetName() { return targetName; } public void setTargetName(String targetName) { this.targetName = targetName; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getBusinessType() { return businessType; } public void setBusinessType(String businessType) { this.businessType = businessType; } public String getOperationName() { return operationName; } public void setOperationName(String operationName) { this.operationName = operationName; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public long getExcuteTime() { return excuteTime; } public void setExcuteTime(long excuteTime) { this.excuteTime = excuteTime; } @Override public String toString() { return "SysLog{" + "id='" + id + '\'' + ", createTime=" + createTime + ", endTime=" + endTime + ", excuteTime=" + excuteTime + ", url='" + url + '\'' + ", params='" + params + '\'' + ", code='" + code + '\'' + ", targetName='" + targetName + '\'' + ", methodName='" + methodName + '\'' + ", businessType='" + businessType + '\'' + ", operationName='" + operationName + '\'' + ", reason='" + reason + '\'' + ", ip='" + ip + '\'' + ", userId='" + userId + '\'' + ", userName='" + userName + '\'' + '}'; } }
2.日志注解
package com.ax.logger.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface SystemLogAnnotation { // 业务类型 String businessType() default ""; // 操作名称 String operationName() default ""; }
3.具体执行代码
package com.ax.logger; import com.ax.constants.Constants; import com.ax.entity.system.SysLog; import com.ax.entity.system.SysUser; import com.ax.entity.system.SysUserVo; import com.ax.logger.annotation.SystemLogAnnotation; import com.ax.result.JsonResult; import com.ax.result.ResultCode; import com.ax.service.SystemClient; import com.ax.util.JsonUtils; import com.ax.util.StringUtil; import org.apache.commons.lang.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Date; /** * 日志切面类 */ @Aspect @Component public class LogAspect { private final static Logger logger = LoggerFactory.getLogger(LogAspect.class); @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired SystemClient systemClient; private SysLog sysLog = new SysLog(); /** * 功能描述: 切点 */ @Pointcut("@annotation(com.ax.logger.annotation.SystemLogAnnotation)") public void executePointCut() { } /** * 功能描述: 请求前执行 */ @Before("executePointCut()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 主键 sysLog.setId(StringUtil.getId()); // 操作时间 sysLog.setCreateTime(new Date()); // 接口地址 sysLog.setUrl(request.getRequestURL().toString()); // 接口名 sysLog.setTargetName(joinPoint.getTarget().getClass().getName()); // 接口方法 sysLog.setMethodName(joinPoint.getSignature().getName()); // 操作名称和业务类型 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); SystemLogAnnotation annotation = signature.getMethod().getAnnotation(SystemLogAnnotation.class); sysLog.setOperationName(annotation.operationName()); sysLog.setBusinessType(annotation.businessType()); // 请求参数 sysLog.setParams(JsonUtils.objectToJson(joinPoint.getArgs())); // 请求ip sysLog.setIp(request.getRemoteAddr()); // 获取头部token String accessToken = request.getHeader("x-auth-token"); if (StringUtils.isNotEmpty(accessToken)) { // 通过token获取用户对象 String sessionKey = Constants.SESSION_KEY_PREFIX + accessToken; ValueOperations<String, String> ops = stringRedisTemplate.opsForValue(); SysUser SysUser = JsonUtils.jsonToPojo(ops.get(sessionKey), SysUser.class); // 操作人userid sysLog.setUserId(SysUser.getUserId()); // 操作人姓名 sysLog.setUserName(SysUser.getUsername()); } } /** * 请求后执行 */ @AfterReturning(returning = "ret", pointcut = "executePointCut()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 JsonResult result = (JsonResult) ret; sysLog.setCode(result.getCode()); // 方法结束时间 sysLog.setEndTime(new Date()); // 计算方法执行时间 long excuteTime = sysLog.getEndTime().getTime() - sysLog.getCreateTime().getTime(); sysLog.setExcuteTime(excuteTime); // 异常原因 if (!StringUtils.equals(result.getCode(), ResultCode.SUCCESS.code)) { sysLog.setReason(result.getMessage()); } //保存日志 systemClient.saveLog(sysLog); System.out.println(sysLog); } }
4.具体实现
@PostMapping("/saveBaseInfo") @SystemLogAnnotation(businessType = "专家信息", operationName = "修改专家信息") public JsonResult saveBaseInfo(@RequestBody ExpertBaseInfo expertBaseInfo) { ... }
原文地址:https://www.cnblogs.com/shiblog/p/11692279.html
- 一个完整的用于追踪数据改变的解决方案
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- 通过内存分析工具来证明字符串驻留机制
- 如果在BackgroundWorker运行过程中关闭窗体…
- 从数据到代码——基于T4的代码生成方式
- 解决T4模板的程序集引用的五种方案
- 编写T4模板进行代码生成无法避免的两个话题:"Assembly Locking"&"Debug"
- 从yield关键字看IEnumerable和Collection的区别
- 让“链式调用(方法链)”更加自然一点
- ASP.NET应用下基于SessionState的“状态编程框架”解决方案
- 为自定义配置的编辑提供”智能感知”的支持
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
- 在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Numpy中的两个乱序函数
- PerfDog4.0探索,支持用户自建web云
- 跨帐号访问COS资源
- 聊聊dubbo-go的DubboProtocol
- 推荐一个很牛叉的开源Flask项目
- 机器学习应用资产管理系列一:强化学习策略(附代码)
- 3分钟短文 | Laravel模型关联删除表记录,用观察者还是事件钩子
- 原理+代码|深入浅出Python随机森林预测实战
- 3分钟短文 | Laravel复杂SQL超多WHERE子句,本地作用域你没用过
- 3分钟短文 | Laravel同时连接多个数据库,你用啥办法?
- 3分钟短文 | PHP 连接2个字符串的8个方法,新手常犯错
- nodejs源码分析之connect
- 你应该了解的Nacos配置中心
- Jenkins CLI 命令行 v0.0.30
- 2020新鲜出炉的“面筋”,够刁钻