使用springbootAOP记录操作日志,异常日志
- 创建日志记录表,异常日志记录表
日志记录表:
Field | Type | Null | Key | Default | Comment |
---|
oper_id | varchar(64) | NO | PRI | null | 主键id |
oper_modul | varchar(64) | YES | | null | 功能模块 |
oper_type | varchar(64) | YES | null | | 操作类型 |
oper_desc | varchar(64) | YES | null | | 操作描述 |
oper_requ_param | text | YES | null | | 请求参数 |
oper_resp_param | text | YES | null | | 返回参数 |
oper_user_id | varchar(64) | YES | null | | 操作员id |
oper_user_name | varchar(64) | YES | null | | 操作员名称 |
oper_method | varchar(255) | YES | null | | 请求方法 |
oper_uri | varchar(255) | YES | null | | 请求URI |
oper_ip | varchar(64) | YES | null | | 请求ip |
oper_create_time | datetime | YES | null | | 操作时间 |
oper_ver | varchar(64) | YES | null | | 操作版本 |
异常日志记录表 | | | | | |
Field | Type | Null | Key | Default | Comment |
---|
exc_id | varchar(64) | NO | PRI | null | 主键id |
exc_requ_param | text | YES | null | | 请求参数 |
exc_name | varchar(255) | YES | null | | 异常名称 |
exc_message | text | YES | null | | 异常信息 |
exc_user_id | varchar(64) | YES | null | | 操作员id |
exc_user_name | varchar(64) | YES | null | | 操作员名称 |
exc_method | varchar(255) | YES | null | | 请求方法 |
exc_uri | varchar(255) | YES | null | | 请求URI |
exc_ip | varchar(64) | YES | null | | 请求ip |
exc_create_time | datetime | YES | null | | 操作时间 |
exc_ver | varchar(64) | YES | null | | 操作版本 |
- 添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 创建操作日志注解类
import java.lang.annotation.Documented;
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)
@Documented
public @interface OperLog {
String operModul() default "";
String operType() default "";
String operDesc() default "";
}
- 创建切面类记录操作日志
@Aspect
@Component
public class OperLogAspect {
@Value("${version}")
private String operVer;
@Autowired
private OperationLogService operationLogService;
@Autowired
private ExceptionLogService exceptionLogService;
@Pointcut("@annotation(com.xxx.xxx.annotation.OperLog)")
public void operLogPoinCut() {
}
@Pointcut("execution(* com.xxx.xxx.controller..*.*(..))")
public void operExceptionLogPoinCut() {
}
@AfterReturning(value = "operLogPoinCut()", returning = "keys")
public void saveOperLog(JoinPoint joinPoint, Object keys) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes
.resolveReference(RequestAttributes.REFERENCE_REQUEST);
OperationLog operlog = new OperationLog();
try {
operlog.setOperId(UuidUtil.get32UUID());
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperLog opLog = method.getAnnotation(OperLog.class);
if (opLog != null) {
String operModul = opLog.operModul();
String operType = opLog.operType();
String operDesc = opLog.operDesc();
operlog.setOperModul(operModul);
operlog.setOperType(operType);
operlog.setOperDesc(operDesc);
}
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
methodName = className + "." + methodName;
operlog.setOperMethod(methodName);
Map<String, String> rtnMap = converMap(request.getParameterMap());
String params = JSON.toJSONString(rtnMap);
operlog.setOperRequParam(params);
operlog.setOperRespParam(JSON.toJSONString(keys));
operlog.setOperUserId(UserShiroUtil.getCurrentUserLoginName());
operlog.setOperUserName(UserShiroUtil.getCurrentUserName());
operlog.setOperIp(IPUtil.getRemortIP(request));
operlog.setOperUri(request.getRequestURI());
operlog.setOperCreateTime(new Date());
operlog.setOperVer(operVer);
operationLogService.insert(operlog);
} catch (Exception e) {
e.printStackTrace();
}
}
@AfterThrowing(pointcut = "operExceptionLogPoinCut()", throwing = "e")
public void saveExceptionLog(JoinPoint joinPoint, Throwable e) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes
.resolveReference(RequestAttributes.REFERENCE_REQUEST);
ExceptionLog excepLog = new ExceptionLog();
try {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
excepLog.setExcId(UuidUtil.get32UUID());
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
methodName = className + "." + methodName;
Map<String, String> rtnMap = converMap(request.getParameterMap());
String params = JSON.toJSONString(rtnMap);
excepLog.setExcRequParam(params);
excepLog.setOperMethod(methodName);
excepLog.setExcName(e.getClass().getName());
excepLog.setExcMessage(stackTraceToString(e.getClass().getName(), e.getMessage(), e.getStackTrace()));
excepLog.setOperUserId(UserShiroUtil.getCurrentUserLoginName());
excepLog.setOperUserName(UserShiroUtil.getCurrentUserName());
excepLog.setOperUri(request.getRequestURI());
excepLog.setOperIp(IPUtil.getRemortIP(request));
excepLog.setOperVer(operVer);
excepLog.setOperCreateTime(new Date());
exceptionLogService.insert(excepLog);
} catch (Exception e2) {
e2.printStackTrace();
}
}
public Map<String, String> converMap(Map<String, String[]> paramMap) {
Map<String, String> rtnMap = new HashMap<String, String>();
for (String key : paramMap.keySet()) {
rtnMap.put(key, paramMap.get(key)[0]);
}
return rtnMap;
}
public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
StringBuffer strbuff = new StringBuffer();
for (StackTraceElement stet : elements) {
strbuff.append(stet + "\n");
}
String message = exceptionName + ":" + exceptionMessage + "\n\t" + strbuff.toString();
return message;
}
}
- 在Controller层方法添加@OperLog注解
@RequestMapping("/")
@OperLog(operModul="首页测试",operType=OprLogConst.GET,operDesc="首页测试")
public Object getIndex(){
return "/index";
}