1、添加一个切点
//配置切点
@Pointcut(value = "execution(* com.*.*.controller.*.*.*(..))")
public void logPoincut() {
}
2、配置class的环绕通知,使用在方法aspect()上注册的切入点
// 配置class的环绕通知,使用在方法aspect()上注册的切入点
@Around(value = "logPoincut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//记录开始时间
long beginTime = System.currentTimeMillis();
// 从请求头中获取所需要的信息
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String loginId = request.getHeader("loginId");
// 获取请求地址
Object requestPath = request.getRequestURI();
String ip = getIpAddr(request);
//格式换开始时间
String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
Object paramObj = joinPoint.getArgs();
String param = null;
if (request.getMethod().equals("POST")){
param = JSONArray.toJSONString(paramObj);
}
//参数
//返回结果
Object resultObj = joinPoint.proceed();
String result = JSONArray.toJSONString(resultObj);
//获取切点方法对象
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
//获取类名
String className = joinPoint.getTarget().getClass().getName();
//获取方法名
String methodName = method.getName();
log.info("*****************************************************************************************************************");
log.info("[访问时间]>>>>>" + optTime);
log.info("[访问 IP]>>>>>" + ip);
log.info("[访问人ID]>>>>>" + loginId);
log.info("[访问路由]>>>>>" + requestPath);
log.info("[访问方法]>>>>>" + className.concat(".").concat(methodName).concat("()"));
log.info("[传入参数]>>>>>" + param);
log.info("[返回参数]>>>>>" + result);
log.info("[耗费时间]>>>>>" + (System.currentTimeMillis() - beginTime) + " ms");
log.info("*****************************************************************************************************************\n");
return resultObj;
}
3、获取异常日志
//获取异常日志
@AfterThrowing(throwing = "ex", pointcut = "logPoincut()")
public void doRecoveryActions(JoinPoint joinPoint, Throwable ex) {
long beginTime = System.currentTimeMillis();
//格式换开始时间
String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
// 获取请求地址
Object requestPath = request.getRequestURI();
String ip = getIpAddr(request);
String loginId = request.getHeader("loginId");
//参数
Object paramObj = joinPoint.getArgs();
String param = null;
if (request.getMethod().equals("POST")){
param = JSONArray.toJSONString(paramObj);
}
//获取切点方法对象
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
//获取类名
String className = joinPoint.getTarget().getClass().getName();
//获取方法名
String methodName = method.getName();
log.error("\n");
log.error("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<异常方法>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
log.error("[异常时间]>>>>>" + optTime);
log.error("[访问 IP]>>>>>" + ip);
log.error("[访问人ID]>>>>>" + loginId);
log.error("[访问路由]>>>>>" + requestPath);
log.error("[异常类型]>>>>>" + ex.getClass().getName());
log.error("[异常方法]>>>>>" + className.concat(".").concat(methodName).concat("()"));
log.error("[传入参数]>>>>>" + param);
log.error("[耗费时间]>>>>>" + (System.currentTimeMillis() - beginTime) + " ms");
log.error("=======================================================================================\n");
}
4、获取访问的IP地址
/**
* 获取IP地址
*/
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
5、配置文件设置
<!--切面日志-->
<!--开启切面功能-->
<!--自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面-->
<!--开启cglib-->
<bean id="aspectLog" class="com.lyh.beacon.util.AspectLog"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>