Spring Boot2.0之統一處理web請求日誌
阿新 • • 發佈:2018-11-10
試問,你的專案中,如果有幾萬個方法,你還這麼寫log.info("name"+name+",age"+age )日誌麼?low~
所以用AOP呀
1、首先建立個aop的包(aop的依賴jar包要在pom中搞定),把下面類,貼進去:
package com.toov5.aop; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes; @Aspect @Component public class WebLogAspect { private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Pointcut("execution(public * com.itmayiedu.controller.*.*(..))") public void webLog() { } @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到請求,記錄請求內容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 記錄下請求內容 logger.info("URL : " + request.getRequestURL().toString()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); logger.info("name:{},value:{}", name, request.getParameter(name)); } } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 處理完請求,返回內容 logger.info("RESPONSE : " + ret); } }
2、後端業務邏輯程式碼:
package com.toov5.ErrorCatch; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import lombok.extern.slf4j.Slf4j; @RestController //以後經常做微服務異常捕獲,要經常用到這個註解 @Slf4j public class ErrorCatch { @RequestMapping("/getUser") public String getUser(int i ){ int j = 1/i; log.info("成功哈"); return "返回"+j; } @RequestMapping("/getMember") public String getMember(String name, Integer age){ // log.info("name"+name+",age"+age );//如果幾萬個方法都要寫這個麼? 所以用aop去統一處理 return "okokok"; } }
3、啟動類我做了一個小修改哈:
擴大了一下掃描範圍
現在整個專案的目錄結構是這樣的:
啟動,請求:
可以看到控制檯:
小夥伴是不是很簡單啊~
後面會介紹:分散式日誌收集系統,也是分散式解決方案的一種~有興趣有的小夥伴可以自己看下