1. 程式人生 > >Spring Boot2.0之統一處理web請求日誌

Spring Boot2.0之統一處理web請求日誌

試問,你的專案中,如果有幾萬個方法,你還這麼寫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、啟動類我做了一個小修改哈:

   

擴大了一下掃描範圍

 

現在整個專案的目錄結構是這樣的:

 

 啟動,請求:

 

 

 

 

可以看到控制檯:

 

 

 小夥伴是不是很簡單啊~

 後面會介紹:分散式日誌收集系統,也是分散式解決方案的一種~有興趣有的小夥伴可以自己看下