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;
// }
}