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.*")








网友评论