待複習|利用aop新增日誌
阿新 • • 發佈:2022-04-04
使用註解
@PostMapping
@LogAnnotation(module="文章", operator="獲取文章列表")
public Result listArticle(@RequestBody PageParams pageParams) {
return articleService.listArticle(pageParams);
}
自定義註解
package com.mszlu.blog.common.aop; import java.lang.annotation.*; /** * @Date: 2022/4/4 4:50 PM */ /** METHOD代表註解可以放在方法上面 */ @Target({ElementType.METHOD}) /** * RUNTIME Annotations are to be recorded in the class file by the compiler and retained by the VM at run time, * so they may be read reflectively. */ @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogAnnotation { String module() default ""; String operator() default ""; }
好像是切面
package com.mszlu.blog.common.aop; import com.alibaba.fastjson.JSON; import com.mszlu.blog.utils.HttpContextUtils; import com.mszlu.blog.utils.IpUtils; import lombok.extern.slf4j.Slf4j; 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.MethodSignature; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** * @Author: Jiang Yizhi * @Date: 2022/4/4 5:11 PM */ @Component @Aspect /** 切面,定義了通知和切點的關係 */ @Slf4j public class LogAspect { @Pointcut("@LogAnnotation(com.mszlu.blog.common.aop.LogAnnotation)") public void pt() {} /** 環繞通知 */ @Around("pt()") public Object log(ProceedingJoinPoint joinPoint) throws Throwable { long beginTime = System.currentTimeMillis(); /** 執行方法 */ Object result = joinPoint.proceed(); /** 執行時長 */ Long time = System.currentTimeMillis() - beginTime; /** 儲存日誌 */ recordLog(joinPoint, time); return result; } private void recordLog(ProceedingJoinPoint joinPoint, Long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class); log.info("================log starts================"); log.info("module:{}", logAnnotation.module()); log.info("operation:{}", logAnnotation.operator()); /** 請求的方法名 */ String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); log.info("request method:{}", className + "." + methodName + "()"); /** 請求的引數 */ Object[] args = joinPoint.getArgs(); String params = JSON.toJSONString(args[0]); log.info("params:{}", params); /** 獲取request 設定ip地址 */ HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); log.info("ip:{}", IpUtils.getIpAddr(request)); } }
下面是工具類IpUtils的程式碼
package com.mszlu.blog.utils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; /** * @Date: 2022/4/4 8:11 PM */ @Slf4j public class IpUtils { /** * 獲取IP地址 * <p> * 使用Nginx等反向代理軟體, 則不能通過request.getRemoteAddr()獲取IP地址 * 如果使用了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP地址,X-Forwarded-For中第一個非unknown的有效IP字串,則為真實IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = null, unknown = "unknown", seperator = ","; int maxLength = 15; try { ip = request.getHeader("x-forwarded-for"); if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } catch (Exception e) { log.error("IpUtils ERROR ", e); } // 使用代理,則獲取第一個IP地址 if (StringUtils.isEmpty(ip) && ip.length() > maxLength) { int idx = ip.indexOf(seperator); if (idx > 0) { ip = ip.substring(0, idx); } } return ip; } /** * 獲取ip地址 * * @return */ public static String getIpAddr() { HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); return getIpAddr(request); } }
`