Commit f9d58b03 by cc150520900118

日志监控aop

parent 85fcb26d
......@@ -21,6 +21,17 @@
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided </scope>
</dependency>
<!--spring切面aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- json解析依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--mybatis-plus-->
<dependency>
......
package com.founder.servicebase.logs;
import java.lang.annotation.*;
/**
* 自定义注解类 OperLog
* Created by LMD on 2019/3/22.
*/
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface OperLog {
String message(); // 介绍
String operation(); // 日志类型
}
package com.founder.servicebase.logs;
/**
* 操作类型类 OperationType
* Created by LMD on 2019/3/22.
*/
public class OperationType {
/**
* 添加
*/
public static final String ADD = "ADD";
/**
* 删除
*/
public static final String DELETE = "DELETE";
/**
* 更新
*/
public static final String UPDATE = "UPDATE";
/**
* 查询
*/
public static final String QUERY = "QUERY";
/**
* 登录
*/
public static final String LOGIN = "LOGIN";
/**
* 退出登录
*/
public static final String LOGOUT = "LOGOUT";
}
package com.founder.servicebase.logs;
import lombok.Data;
import java.io.Serializable;
/**
* 日志实体类 SysLog
* Created by LMD on 2019/3/22.
*/
@Data
public class SysLog implements Serializable {
private Long id; //
private String userId; // 操作用户 ID
private String message; // 消息
private String operation; // 日志类型
private String method; // 请求方法
private String params; // 请求参数
private String ip; // 请求IP
private String createDate;// 请求时间
private Long totalTime; //总耗时长(毫秒)
private String content; // 返回值
//添加set和get方法
}
\ No newline at end of file
package com.founder.servicebase.logs;
import lombok.SneakyThrows;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
*
* 系统日志:切面处理类
*
* Created by LMD on 2019/3/22.
*/
@Aspect
@Component
public class SysLogAspect {
private static Logger LOG = LoggerFactory.getLogger(SysLogAspect.class);
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation( com.founder.servicebase.logs.OperLog)")
public void logPoinCut() {
}
//@Around:环绕通知
@SneakyThrows
@Around("logPoinCut()")
public Object saveSysLog(ProceedingJoinPoint proceedingJoinPoint) {
System.out.println("环绕通知开始。。。。。");
//保存日志
SysLog sysLog = new SysLog();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod();
//获取操作
OperLog myLog = method.getAnnotation(OperLog.class);
if (myLog != null) {
String value = myLog.message();
sysLog.setMessage(value);//保存获取的操作
}
//获取请求的类名
String className = proceedingJoinPoint.getTarget().getClass().getName();
//获取请求的方法名
String methodName = method.getName();
sysLog.setMethod(className + "." + methodName);
//请求参数 和对应的值
Map<String, Object> map=getNameAndValue(proceedingJoinPoint);
sysLog.setParams(map.toString());
//请求时间
Date date = new Date();
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
sysLog.setCreateDate(simpleDateFormat.format(date));
//获取用户名
//获取用户ip地址
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
LOG.info("URL : " + request.getRequestURL().toString());
LOG.info("HTTP_METHOD : " + request.getMethod());
LOG.info("IP : " + request.getRemoteAddr());
sysLog.setIp(request.getRemoteAddr());
//开始调用时间
// 计时并调用目标函数
long start = System.currentTimeMillis();
Long time = System.currentTimeMillis() - start;
sysLog.setTotalTime(time);
try {
Object result = proceedingJoinPoint.proceed();
if(!StringUtils.isEmpty(result)){
sysLog.setContent(result.toString());
}
} catch (Throwable throwable) {
String erro="";
throwable.printStackTrace();
erro=log(throwable);
sysLog.setContent(erro);
}
System.out.print("保存数据库=="+sysLog.toString());
//调用service保存SysLog实体类到数据库
//sysLogService.save(sysLog);
return null;
}
/**
* 获取参数Map集合
* @param joinPoint
* @return
*/
Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
Map<String, Object> param = new HashMap<>();
Object[] paramValues = joinPoint.getArgs();
String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
for (int i = 0; i < paramNames.length; i++) {
param.put(paramNames[i], paramValues[i]);
}
return param;
}
/**
* @Desc: 异常打印日志 ,提供给打印非正常异常
* @Author HealerJean
* @Date 2018/8/21 下午6:41.
*/
public static String log(Throwable e){
StackTraceElement s= e.getStackTrace()[0];//数组长度为 1
String content= ("\n\n-----------------" +
"\n报错文件名:" + s.getFileName() +
"\n报错的类:" + s.getClassName() +
"\n报错方法::" + s.getMethodName() +
"\n报错的行:" + s.getLineNumber() +
"\n报错的message:" + e.getMessage() +
"\n------------------\n\n");
System.out.println("111111111111111"+content);
return content;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment