美文网首页
SpringBoot 拦截器打印日志

SpringBoot 拦截器打印日志

作者: 头发掉了 | 来源:发表于2022-08-14 03:23 被阅读0次
package custom.log;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.ribbon.proxy.annotation.Http;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
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.slf4j.Marker;
import org.slf4j.helpers.BasicMarker;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.ServletServerHttpAsyncRequestControl;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.ServletContextAttributeFactoryBean;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;

@Aspect
@Component
@Order(-1)
public class LoggingAspect {


    public static ThreadLocal<ServletRequest> requestThreadLocal = new ThreadLocal<>();
    Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    public LoggingAspect() {

        System.out.println("Aspect Service Called");

    }


    @Before("@annotation(org.springframework.web.bind.annotation.RestController)" +
            "||@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
            "||@annotation(org.springframework.web.bind.annotation.PostMapping)" +
            "||@annotation(org.springframework.web.bind.annotation.DeleteMapping)" +
            "||@annotation(org.springframework.web.bind.annotation.PatchMapping)" +
            "||@annotation(org.springframework.web.bind.annotation.PutMapping)")
    public void before() throws Throwable {
        //打印日志
        try {
            logger.info("请求Before日志:{}", new RequestLogBuilder((HttpServletRequest)requestThreadLocal.get()).builder());
        } catch (Exception e) {
            logger.error("", ExceptionUtils.getRootCause(e));
        }

    }

}
package custom.log;

import com.fasterxml.jackson.databind.util.JSONPObject;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.lang.time.FastDateFormat;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class RequestLogBuilder {

    private Map<String,Object> requestMap= new ConcurrentHashMap();

    private HttpServletRequest request;

    public RequestLogBuilder(HttpServletRequest request){
        if(null==request){
            throw  new RuntimeException("request is must not be empty");
        }
        this.request=request;
    }

    private RequestLogBuilder header(){
        requestMap.put("header",getRequestHeader());
        return  this;
    }

    private RequestLogBuilder url(){
        requestMap.put("url",request.getRequestURL());
        return  this;
    }

    private RequestLogBuilder method(){
        requestMap.put("method",request.getMethod());
        return  this;
    }


    private RequestLogBuilder uri(){
        if(HttpMethod.GET.matches(request.getMethod())) {
            requestMap.put("uri", getRequestURI());
        }
        return  this;
    }


    private RequestLogBuilder payload() throws IOException {
        if(HttpMethod.POST.matches(request.getMethod())) {
            requestMap.put("payLoad", request.getReader().readLine());
        }
        return  this;
    }

    private Map<String,Object> getRequestHeader(){

        Enumeration headerNames = request.getHeaderNames();
        Map<String,Object> headerMap=new HashMap();
        while (headerNames.hasMoreElements()) {
            String headerName = (String) headerNames.nextElement();
            headerMap.put(headerName,request.getHeader(headerName));
        }
        return  headerMap;
    }

    public  Map builder(){
        this.method();
        this.uri();
        this.header();
        try {
            this.payload();
        } catch (IOException e) {
            System.err.println("logging error:"+ ExceptionUtils.getRootCauseMessage(e));
        }
        return  this.requestMap;
    }

    private String getRequestURI(){
        final StringBuilder uriBuilder = new StringBuilder();
        Enumeration parameterNames = request.getParameterNames();
        Map<String, Object> paramMap = new HashMap();
        while (parameterNames.hasMoreElements()) {
            String paramName = (String) parameterNames.nextElement();
            paramMap.put(paramName, request.getParameter(paramName));
            uriBuilder.append(paramName + "=" + request.getParameter(paramName)).append("&");
        }
        uriBuilder.append("requestTime=").append(FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return uriBuilder.toString();
    }

}

package custom.log;

import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextListener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.annotation.WebListener;

@WebListener
public class RequestLoggingContextListener extends RequestContextListener {

    @Override
    public void requestInitialized(ServletRequestEvent requestEvent) {
        if (requestEvent.getServletRequest().isAsyncStarted() && requestEvent.getServletRequest().isAsyncSupported()) {
            LoggingAspect.requestThreadLocal.set(requestEvent.getServletRequest().getAsyncContext().getRequest());
        } else {
            LoggingAspect.requestThreadLocal.set(requestEvent.getServletRequest());
        }
        super.requestInitialized(requestEvent);
    }
}

配置

@ServletComponentScan(basePackages = "custom.*")

相关文章

网友评论

      本文标题:SpringBoot 拦截器打印日志

      本文链接:https://www.haomeiwen.com/subject/pphzectx.html