欢迎访问优讯网!
您当前的位置:首页 > 爱编程

Spring AOP实现系统日志功能 SpringBoot实现日志功能

时间:2019-04-11 10:22:06  来源:优讯网  作者:小卡司  浏览次数:
Spring AOP实现系统日志功能 SpringBoot实现日志功能  系统需求:针对每一位登陆的用户的操作进行记录并以日志的形式写入到数据库中,使用的方法就是Spring AOP的运用,在操作之前设置切面,获取用户信息与操作的方法的参数,然后打包成实体类进行存储,下面介绍详细的实现过程!

首先是POM文件的内容,需要引入支持SpringAOP的依赖:

<!--spring切面aop依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

创建自定义注解类,使用这个来切入切点:
import java.lang.annotation.*;

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

创建实体类:
import java.util.Date;

public class SysLog {
    private Integer logId;
    private String userName;
    private String operation;
    private String method;
    private String params;
    private String ip;
    private Integer isdel;
    private Date createTime;
    private Date updateTime;
    public Integer getLogId() {
        return logId;
    }
    public void setLogId(Integer logId) {
        this.logId = logId;
    }
  public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }
    public String getOperation() {
        return operation;
    }
    public void setOperation(String operation) {
        this.operation = operation == null ? null : operation.trim();
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method == null ? null : method.trim();
    }
    public String getParams() {
        return params;
    }
    public void setParams(String params) {
        this.params = params == null ? null : params.trim();
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip == null ? null : ip.trim();
    }
    public Integer getIsdel() {
        return isdel;
    }
    public void setIsdel(Integer isdel) {
        this.isdel = isdel;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
@Override
public String toString() {
return "SysLog [logId=" + logId + ", userName=" + userName + ", operation=" + operation + ", method=" + method
+ ", params=" + params + ", ip=" + ip + ", isdel=" + isdel + ", createTime=" + createTime
+ ", updateTime=" + updateTime + "]";
}
}

创建数据库表:
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log`  (
  `log_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志id',
  `user_name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `operation` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作',
  `method` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '方法名',
  `params` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数',
  `ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
  `isdel` int(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`log_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

创建AOP的实现类,代码如下:

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;
import com.bjidit.mis.common.Constants;
import com.bjidit.mis.entity.SysLog;
import com.bjidit.mis.entity.User;
import com.bjidit.mis.service.SysLogService;
import com.bjidit.mis.utils.IpAdrressUtil;

/**
 * 系统日志:切面处理类
 */
@Aspect
@Component
public class SysLogAspect {

    @Autowired
    private SysLogService sysLogService;

    //定义切点 @Pointcut
    //在注解的位置切入代码
    @Pointcut("@annotation( com.bjidit.mis.syslog.MyLog)")
    public void logPoinCut() {
    }

    //切面 配置通知
    @AfterReturning("logPoinCut()")
    public void saveSysLog(JoinPoint joinPoint) {
        System.out.println("切面。。。。。");
        HttpServletRequest request =
          ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
           HttpSession session =request.getSession();
        //保存日志
        SysLog sysLog = new SysLog();

        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //获取切入点所在的方法
        Method method = signature.getMethod();

        //获取操作
        MyLog myLog = method.getAnnotation(MyLog.class);
        if (myLog != null) {
            String value = myLog.value();
            sysLog.setOperation(value);//保存获取的操作
        }

        //获取请求的类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取请求的方法名
        String methodName = method.getName();
        sysLog.setMethod(className + "." + methodName);
        
        //请求的参数,将参数所在的数组转换成json
        Object[] args = joinPoint.getArgs();
        Object[] arguments  = new Object[args.length];
        for (int i = 0; i < args.length; i++) {
        System.out.println(args[i]);
            if (args[i] instanceof Integer || args[i] instanceof String) {
            arguments[i] = args[i];
            }
            continue;
        }
        String params = "";
        if (arguments != null) {
            try {
            params = JSON.toJSONString(arguments);
            } catch (Exception e) {
            params = "无特殊参数";
            }
        }
        sysLog.setParams(params);
        
        //获取用户名
        User user = (User)session.getAttribute(Constants.LOGIN_KEY);
        sysLog.setUserName(user.getUserName());
        
        //获取用户ip地址
        sysLog.setIp(IpAdrressUtil.getIpAdrress(request));
        //设置时间
        sysLog.setCreateTime(new Date());
        
        //调用service保存SysLog实体类到数据库
        sysLogService.saveSysLog(sysLog);
    }
}

在想要记录日志的controller上添加自定义注解就行了,代码实现如下:

@MyLog(value = "登陆")  //这里添加了AOP的自定义注解
@RequestMapping(value = "/signin.do")
@ResponseBody
public Json dosignin(HttpServletRequest request, HttpSession session, Model model, User user) throws Exception {}

以上就是关于 Spring AOP实现系统日志功能 SpringBoot实现日志功能 的全部内容了,喜欢的小伙伴别忘了点赞分享一下哦,关注优讯网,优讯有你更精彩!
来顶一下
返回首页
返回首页

本文未标明来源,如有侵权请联系发布者删除!


推荐资讯
如何下载旧版centos iso镜像 如何下载迷你mini版的centos镜像
如何下载旧版centos i
计算机的正确使用姿势 电脑痴如何正确的使用电脑
计算机的正确使用姿势
好用的后台管理的前端框架模版H-ui H-ui框架模版分享
好用的后台管理的前端
微信电脑多开方法 无需辅助电脑版微信双开方法分享
微信电脑多开方法 无
相关文章
    无相关信息
栏目更新
栏目热门