操作日志统一处理(切面)

1,简介:
日志切面可以通过在方法上加注解,记录操作日志入库
具体参考:https://www.cnblogs.com/inspred/p/10385005.html
2,上代码

org.springframework.boot
spring-boot-starter-aop

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.7</version>
    </dependency>

切面:
注解类
package com.zkml.hkm.systemlog;

import java.lang.annotation.*;

/**

  • 操作日志注解
  • @author xie
    */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface OperateLog {

// // 菜单名称,如数据项
// String name();
//
// // 功能名称,如分页查询
// String desc();

// 操作模块
String module();

// // 操作类型
// OperLogEnum action();

// 是否插入请求参数
boolean isAddParam() default true;

}
枚举类:
package com.zkml.hkm.systemlog;

/**

  • @author xie
    */
    public enum OperLogEnum {
    add,
    update,
    delete,
    query,
    upload,
    download

}
切面:
package com.zkml.hkm.systemlog;

import com.zkml.hkm.systemlog.service.impl.SystemLogServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**

  • 切面日志记录

  • @Autor xie

  • @Date 2022/02/10
    */
    @Aspect
    @Component
    @Slf4j
    public class SystemLogAspect {

    @Autowired
    private SystemLogServiceImpl systemLogServiceImpl;

    @Autowired
    private HttpServletRequest request;

// @Pointcut(value=“execution(* com.zkml.hkm.web….(…))”)
// public void pointcut(){
//
// }

// 切点
@Pointcut("@annotation(com.zkml.hkm.systemlog.OperateLog)")
public void OperateLogPoint() {

}

// @Before(“pointcut()”)
// public void before(JoinPoint joinPoint) throws Throwable {
// System.out.println(“before”);
// }
//
// @After(“pointcut()”)
// public void after(JoinPoint joinPoint) throws Throwable {
// System.out.println(“after”);
// }
//
// @AfterThrowing(“pointcut()”)
// public void afterThrowing(JoinPoint joinPoint) throws Throwable {
// System.out.println(“afterThrowing”);
// }
//
// @AfterReturning(“pointcut()”)
// public void afterReturning(JoinPoint joinPoint) throws Throwable {
// System.out.println(“afterReturning”);
// }

@Around(value = "OperateLogPoint()")
public void around(JoinPoint joinPoint) throws Throwable {

    //实例化获取HttpServletRequest

// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// HttpServletRequest request = attributes.getRequest();
String methodName = joinPoint.getSignature().getName();
Method method = currentMethod(joinPoint,methodName);
OperateLog log = method.getAnnotation(OperateLog.class);
String token = “A58DE85395A547648D8D4F8D84C2DBBB”;
systemLogServiceImpl.put(token,log.module());

// System.out.println(“around”);
// log.info(joinPoint.getArgs() != null ? joinPoint.getArgs().toString() : “”);
// MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
// Method method = methodSignature.getMethod();
// log.info(method.getName());
// Parameter[] parameters = method.getParameters();
// for (Parameter param : parameters) {
// System.out.println(param.getName() + “—” + param.getType() + “—”);
// }
}

/**
 * 获取当前执行的方法
 *
 * @param joinPoint  连接点
 * @param methodName 方法名称
 * @return 方法
 */
private Method currentMethod(JoinPoint joinPoint, String methodName) {
    /**
     * 获取目标类的所有方法,找到当前要执行的方法
     */
    Method[] methods = joinPoint.getTarget().getClass().getMethods();
    Method resultMethod = null;
    for (Method method : methods) {
        if (method.getName().equals(methodName)) {
            resultMethod = method;
            break;
        }
    }
    return resultMethod;
}

}
处理类:
package com.zkml.hkm.systemlog.service.impl;

import com.zkml.hkm.common.ResponseBean;
import com.zkml.hkm.common.constants.CheckResult;
import com.zkml.hkm.common.constants.Constant;
import com.zkml.hkm.common.constants.HkmResponse;
import com.zkml.hkm.systemlog.mapper.SystemLogMapper;
import com.zkml.hkm.systemlog.pojo.SystemLog;
import com.zkml.hkm.systemlog.pojo.SystemLogParam;
import com.zkml.hkm.systemlog.service.SystemLogService;
import com.zkml.hkm.utils.IpUtils;
import com.zkml.hkm.utils.RequestUtil;
import com.zkml.hkm.web.business.service.CommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**

  • @author xie

  • 操作日志实现类
    */
    @Slf4j
    @Service
    public class SystemLogServiceImpl implements SystemLogService {

    private static final String LOG_CONTENT = “[类名]:%s,[方法]:%s,[参数]:%s,[IP]:%s”;

    @Autowired
    private SystemLogMapper systemLogMapper;

    @Autowired
    private CommonService commonService;

    /**

    • 插入操作日志
      */
      @Override
      public void insertSystemLog(String operateModule, String operateObject, String content) {
      try {
      // 获取token
      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
      String token = RequestUtil.getRequestToken(request);
      SystemLog systemLog = new SystemLog();
      //操作时间
      systemLog.setOperateTime(new Date());
      //操作对象
      systemLog.setOperateModule(operateModule);
      //ip地址
      String ip = IpUtils.getIpAddr(request);
      systemLog.setIpAddress(ip);
      //操作账号,人员
      HkmResponse getUserInfoResponse = commonService.getUserInfo(token);
      if(CheckResult.SUCCESS == getUserInfoResponse.getCode()){
      Map<String,Object> resultMap = (Map) getUserInfoResponse.getData();
      // systemLog.setOperator( (String) resultMap.get(“user”));
      systemLog.setOperator( (String) resultMap.get(“phone”));
      systemLog.setOperateName( (String) resultMap.get(“userName”));
      log.info(getUserInfoResponse.getMsg());
      }else{
      log.info(getUserInfoResponse.getMsg());
      }
      //操作对象
      systemLog.setOperateObject(operateObject);
      //操作内容
      systemLog.setContent(content);
      systemLogMapper.insertSystemLog(systemLog);
      } catch (Exception e) {
      e.printStackTrace();
      }
      }

    /**

    • 系统日志查询

    • @param

    • @return
      */
      @Override
      public ResponseBean querySystemLog(SystemLogParam systemLogParam) {

      log.info(“系统日志列表查询参数:{}”,systemLogParam);
      ResponseBean response = new ResponseBean();
      try{
      // 查询系统日志列表条数
      long totalCount = systemLogMapper.querySystemLogCount(systemLogParam);
      log.info(“系统日志列表查询条数:{}”,totalCount);

       List<SystemLog> systemLogList = new ArrayList<>();
       if(totalCount>0){
           // 查询总行详情列表
           systemLogList = systemLogMapper.querySystemLog(systemLogParam);
       }
       Map<String, Object> result = new HashMap<>(Constant.MAP_DEFAULT_SIZE);
       result.put("total", totalCount);
       result.put("content",systemLogList);
       result.put("pageSize",systemLogParam.getPageSize());
       result.put("pageNum",systemLogParam.getPageNum());
       response.setData(result);
       response.setCode(1);
       response.setMessage("系统日志列表查询成功!");
       return response;
      

      }catch (Exception e){
      log.info(“系统日志列表查询异常:{}”,e);
      response.setStatus(Constant.FAIL_STATUS);
      response.setCode(0);
      response.setMessage(“系统日志列表查询异常!”);
      return response;
      }
      }

    public void put(String token, String module) {
    try {
    // HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

         SystemLog systemLog = new SystemLog();
    

// String ip = IpUtils.getIpAddr(request);
// systemLog.setIpAddress(ip);
systemLog.setOperateTime(new Date());
systemLog.setOperateModule(module);
// String token = RequestUtil.getRequestToken(request);
log.info(“用户token=============>{}”,token);
HkmResponse getUserInfoResponse = commonService.getUserInfo(token);
if(CheckResult.SUCCESS == getUserInfoResponse.getCode()){
Map<String,Object> resultMap = (Map) getUserInfoResponse.getData();
systemLog.setOperator( (String) resultMap.get(“user”));
systemLog.setOperateName( (String) resultMap.get(“userName”));
log.info(getUserInfoResponse.getMsg());
}else{
log.info(getUserInfoResponse.getMsg());
}
// systemLog.setOperateObject();
// systemLog.setContent(operateContent(joinPoint, methodName, ip, request));
systemLogMapper.insertSystemLog(systemLog);
} catch (Exception e) {
e.printStackTrace();
}
}

// public String operateContent(JoinPoint joinPoint, String methodName, String ip, HttpServletRequest request) throws ClassNotFoundException, NotFoundException {
// String className = joinPoint.getTarget().getClass().getName();
// Object[] params = joinPoint.getArgs();
// String classType = joinPoint.getTarget().getClass().getName();
// Class<?> clazz = Class.forName(classType);
// String clazzName = clazz.getName();
// Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,params);
// StringBuffer bf = new StringBuffer();
// if (!CollectionUtils.isEmpty(nameAndArgs)){
// Iterator it = nameAndArgs.entrySet().iterator();
// while (it.hasNext()){
// Map.Entry entry = (Map.Entry) it.next();
// String key = (String) entry.getKey();
// String value = JSONObject.toJSONString(entry.getValue());
// bf.append(key).append("=");
// bf.append(value).append("&");
// }
// }
// if (StringUtils.isEmpty(bf.toString())){
// bf.append(request.getQueryString());
// }
// return String.format(LOG_CONTENT, className, methodName, bf.toString(), ip);
// }
//
//
// private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {
// Map<String,Object > map=new HashMap<String,Object>();
//
// ClassPool pool = ClassPool.getDefault();
// ClassClassPath classPath = new ClassClassPath(cls);
// pool.insertClassPath(classPath);
//
// CtClass cc = pool.get(clazzName);
// CtMethod cm = cc.getDeclaredMethod(methodName);
// MethodInfo methodInfo = cm.getMethodInfo();
// CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
// LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
// if (attr == null) {
// // exception
// return map;
// }
// int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
// for (int i = 0; i < cm.getParameterTypes().length; i++){
// map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名
// }
// return map;
// }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值