简易的用户操作日志记录

记录系统内用户的操作日志。

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

时间: 2024-10-28 11:13:13

简易的用户操作日志记录的相关文章

利用Hibernate监听器实现用户操作日志

网上搜索发现,实现用户操作日志的方式有:自定义注解方式.Hibernate拦截器方式.Hibernate监听器方式等. 1.自定义注解方式较为麻烦,需要进行操作记录的方法均需要添加注解,但是相对的操作描述更为针对性,缺点是无法获得所操作的实体ID以及成员: 2.拦截器方式经我自己试验,拦截器是在Hibernate操作数据库之前执行的,所以同样获取不了所操作的实体ID和成员,但是相对注解方式来说,不用在原有代码上更改添加注解等,耦合性比较低. 使用拦截器需要保证数据库操作均是对实体类的操作,即使用

基于NopCommerce的开发框架——缓存、网站设置、系统日志、用户操作日志

最近忙于学车,抽时间将Nop的一些公用模块添加进来,反应的一些小问题也做了修复.另外有园友指出Nop内存消耗大,作为一个开源电商项目,性能方面不是该团队首要考虑的,开发容易,稳定,代码结构清晰简洁也是很重要的一个方面,另外性能的优化也不仅仅是在框架层面.笔者在使用其开发一些中小型的项目,性能还在可以接受范围.前篇——基于nopCommerce的开发框架(附源码):http://www.cnblogs.com/dreling/p/6906688.html. 最新的代码已经同布到GitHub:htt

mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址. 现在我们接着上节课,完成第二个功能,不管成功不成功都记录一个日志. 一.回顾上节课内容,我们在user_log表中添加一个字段 user_id.  在上一节课的存储过程新增一行代码,如下: BEGIN set @gid=0; set @user_name=''; set @_res

在MySQL中使用init-connect与binlog来实现用户操作追踪记录

前言:测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化,我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等.实现审计. 1,在mysql服务器db中建立单独的记录访问信息的库set names utf8;create databas

按时按登录IP记录Linux所有用户操作日志的方法(附脚本)

PS:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所有用户登录所操作的日志记录! 在/etc/profile配置文件的末尾加入以下脚本代码就可以实现,下面脚本是我网上找来的,原作者不知.但原脚本的时间变量有错误,不能记录时间,本人测试发现并检查修正: PS1="`whoami`@`hostname`:"'[$PWD]' history US

php记录用户操作日志的解决方案

b/s系统,客户要求系统要记录所有用户的操作(查看.修改.删除.添加等操作)功能 现在没有很好的方案来实现,不知哪位童鞋做过,给点思路 问题: 1.保存到数据库的话,数据量会非常大--肯定影响性能,不知有没有好的解决办法 2.保存到文件的话,是保存到一个文件中还是根据日期来保存到很多个文件中 如果保存到一个文件中也会有数据过大的问题 保存到很多文件的话如何实现根据不同用户检索操作日志以及分页显示问题 http://c.tieba.baidu.com/p/3393155246 http://c.t

操作日志记录

1.存在的意义 所日志记录,就是记录所有的操作,使领导对这个系统的流转了如指掌,同时要是系统出现了问题,也可以清楚找到问题的所在. 2. 界面展示 3. 主要代码分析(提供三种方法)   3.1 方法一 使用aop实现 源码介绍: 01.首先在保证你的环境无误的情况下(我用的是ssh) 02.BussAnnotation.java  (自定义注解) package cn.bdqn.annotation; /** * 自定义注解(用于记录日志) */ import java.lang.annota

springmvc+log4j操作日志记录,详细配置

没有接触过的,先了解一下:log4j教程 部分内容来:log4j教程 感谢! 需要导入包: log包:log4j-12.17.jar 第一步:web.xml配置 <!-- log4j配置,文件路径,因为是跟随项目启动 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value>

log4j MDC用户操作日志追踪配置

https://blog.csdn.net/userwyh/article/details/52862216 一.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能.某些应用程序采用多线程的方式来处理多个用户的请求.在一个用户的使用过程中,可能有多个不同的线程来进行处理.典型的例子是 Web 应用服务器.当用户访问某个页面时,应用服务器可能会创建一个新的线程来处理该请求,也可能从线