Commit 85e48f87 by huluobin

战术更新

parent 8f257ddc
...@@ -2,7 +2,11 @@ package com.gogirl.infrastructure.common.exception; ...@@ -2,7 +2,11 @@ package com.gogirl.infrastructure.common.exception;
import com.gogirl.infrastructure.common.base.JsonResult; import com.gogirl.infrastructure.common.base.JsonResult;
import com.gogirl.infrastructure.common.util.JsonUtilByJackson;
import com.gogirl.infrastructure.common.wrapper.RequestBakRequestWrapper;
import com.gogirl.infrastructure.service.mail.MailService; import com.gogirl.infrastructure.service.mail.MailService;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
...@@ -50,32 +54,57 @@ public class RRExceptionHandler { ...@@ -50,32 +54,57 @@ public class RRExceptionHandler {
*/ */
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
public JsonResult<String> handleException(HttpServletRequest request, public JsonResult<String> handleException(HttpServletRequest request,
Exception e) { Exception ex) {
JsonResult<String> result = new JsonResult<>(); JsonResult<String> result = new JsonResult<>();
result.setSuccess(false); result.setSuccess(false);
result.setCode(500); result.setCode(500);
result.setMessage(e.getMessage()); result.setMessage(ex.getMessage());
log.error("************************异常开始*******************************");
log.error("uri,{}", request.getRequestURI()); RequestBakRequestWrapper bakRequestWrapper = (RequestBakRequestWrapper) request;
log.error("params:{}", request.getParameterMap().toString());
//输出日志
this.log(e, request);
//错误邮件内容
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw); PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw); ex.printStackTrace(pw);
ErrorLog errorLog = ErrorLog.builder()
.uri(bakRequestWrapper.getRequestURI())
.param(JsonUtilByJackson.writeValueAsString(bakRequestWrapper.getParameterMap()))
.payload(bakRequestWrapper.getCachedContent().toString())
.errorMsg(ex.getMessage())
.StackTrace(sw.toString())
.build()
//输出日志
log.error("******异常开始*******");
log.info("uri:{}", errorLog.getUri());
log.info("param:{}", errorLog.getParam());
log.info("payload:{}", errorLog.getPayload());
log.error(ex.getMessage(), ex);
log.error("******异常结束********");
//错误邮件内容
//发送邮件 //发送邮件
if (profile.equals("prod")) // if (profile.equals("prod"))
mailService.sendSimpleMail("robbendev@qq.com", profile + "异常", sw.toString()); mailService.sendSimpleMail("robbendev@qq.com", profile + "异常", sw.toString());
return result; return result;
} }
private void log(Exception ex, HttpServletRequest request) { @Data
log.error(ex.getMessage(), ex); @Builder
log.error("************************异常结束*******************************"); static class ErrorLog {
private String uri;
private String traceId;
private String param;
private String payload;
private String errorMsg;
private String StackTrace;
} }
} }
package com.gogirl.infrastructure.common.filter; package com.gogirl.infrastructure.common.filter;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.gogirl.infrastructure.common.util.JsonUtilByJackson;
import com.gogirl.infrastructure.common.wrapper.RequestBakRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC; import org.slf4j.MDC;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**
...@@ -17,6 +22,7 @@ import java.io.IOException; ...@@ -17,6 +22,7 @@ import java.io.IOException;
@Component @Component
@ServletComponentScan @ServletComponentScan
@WebFilter(urlPatterns = {"/customer/*", "/technician/*"}, filterName = "requestLogFilter") @WebFilter(urlPatterns = {"/customer/*", "/technician/*"}, filterName = "requestLogFilter")
@Slf4j
public class RequestLogFilter implements Filter { public class RequestLogFilter implements Filter {
@Override @Override
...@@ -29,6 +35,13 @@ public class RequestLogFilter implements Filter { ...@@ -29,6 +35,13 @@ public class RequestLogFilter implements Filter {
String traceId = IdWorker.getIdStr(); String traceId = IdWorker.getIdStr();
request.setAttribute("traceId", traceId); request.setAttribute("traceId", traceId);
MDC.put("traceId", traceId); MDC.put("traceId", traceId);
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
RequestBakRequestWrapper bakRequestWrapper = (RequestBakRequestWrapper) request;
log.info("uri:{}", bakRequestWrapper.getRequestURI());
log.info("param:{}", JsonUtilByJackson.writeValueAsString(bakRequestWrapper.getParameterMap()));
log.info("payload:{}", bakRequestWrapper.getCachedContent().toString());
}
chain.doFilter(request, response); chain.doFilter(request, response);
} }
......
package com.gogirl.infrastructure.common.interceptor;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.NamedThreadLocal;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Map;
/**
* 统一日志拦截记录
*/
@Component
@AllArgsConstructor
@Slf4j
public class LogHandlerInterceptor implements HandlerInterceptor {
private static final ThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<>("ThreadLocal StartTime");
/**
* 将ErrorStack转化为String.
*/
public static String getStackTraceAsString(Throwable e) {
if (e == null) {
return "";
}
StringWriter stringWriter = new StringWriter();
e.printStackTrace(new PrintWriter(stringWriter));
return stringWriter.toString();
}
private String getParamString(Map<String, String[]> map) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String[]> e : map.entrySet()) {
sb.append(e.getKey()).append("=");
String[] value = e.getValue();
if (value != null && value.length == 1) {
sb.append(value[0]).append("\t");
} else {
sb.append(Arrays.toString(value)).append("\t");
}
}
return sb.toString();
}
/**
* 该方法将在请求处理之前进行调用。
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
* Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
startTimeThreadLocal.set(startTime); //线程绑定变量(该数据只有当前请求的线程可见)
if (handler instanceof HandlerMethod) {
StringBuilder sb = new StringBuilder(1000);
sb.append("-----------------------开始计时:").append(new SimpleDateFormat("hh:mm:ss.SSS").format(startTime)).append("-------------------------------------\n");
HandlerMethod h = (HandlerMethod) handler;
sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");
sb.append("Method : ").append(h.getMethod().getName()).append("\n");
sb.append("Params : ").append(getParamString(request.getParameterMap())).append("\n");
sb.append("URI : ").append(request.getRequestURI()).append("\n");
log.info(sb.toString());
}
return true;
}
/**
* 在当前请求进行处理之后,也就是Controller 方法调用之后执行,
* 但是它会在DispatcherServlet 进行视图返回渲染之前被调用,
* 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
if (handler instanceof HandlerMethod) {
StringBuilder sb = new StringBuilder(1000);
sb.append("CostTime : ").append(executeTime).append("ms").append("\n");
sb.append("-------------------------------------------------------------------------------");
log.info(sb.toString());
}
}
/**
* 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 打印JVM信息。
if (log.isDebugEnabled()) {
long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)
long endTime = System.currentTimeMillis(); //2、结束时间
//如果controller报错,则记录异常错误
if (ex != null) {
log.debug("Controller异常: " + getStackTraceAsString(ex));
}
log.debug("计时结束:" + new SimpleDateFormat("hh:mm:ss.SSS").format(endTime) + " 耗时:" + (endTime - beginTime) + " URI:" +
request.getRequestURI() + " 最大内存: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m 已分配内存: " + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m 已分配内存中的剩余空间: " + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "m 最大可用内存: " +
(Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory() + Runtime.getRuntime().freeMemory()) / 1024 / 1024 + "m");
startTimeThreadLocal.remove();
}
}
}
...@@ -18,7 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp ...@@ -18,7 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp
public class MvcInterceptorConfig extends WebMvcConfigurationSupport { public class MvcInterceptorConfig extends WebMvcConfigurationSupport {
private final LoginHandlerInterceptor loginHandlerInterceptor; private final LoginHandlerInterceptor loginHandlerInterceptor;
private final LogHandlerInterceptor logHandlerInterceptor;
private final SessionHandlerInterceptor sessionHandlerInterceptor; private final SessionHandlerInterceptor sessionHandlerInterceptor;
private final AuthHandlerInterceptor authHandlerInterceptor; private final AuthHandlerInterceptor authHandlerInterceptor;
...@@ -32,7 +31,6 @@ public class MvcInterceptorConfig extends WebMvcConfigurationSupport { ...@@ -32,7 +31,6 @@ public class MvcInterceptorConfig extends WebMvcConfigurationSupport {
.excludePathPatterns("/csrf") .excludePathPatterns("/csrf")
; ;
registry.addInterceptor(logHandlerInterceptor);
registry.addInterceptor(sessionHandlerInterceptor); registry.addInterceptor(sessionHandlerInterceptor);
registry.addInterceptor(authHandlerInterceptor) registry.addInterceptor(authHandlerInterceptor)
.addPathPatterns("/**") .addPathPatterns("/**")
......
...@@ -74,6 +74,10 @@ public class RequestBakRequestWrapper extends HttpServletRequestWrapper { ...@@ -74,6 +74,10 @@ public class RequestBakRequestWrapper extends HttpServletRequestWrapper {
return this.cachedContent.toByteArray(); return this.cachedContent.toByteArray();
} }
public ByteArrayOutputStream getCachedContent() {
return this.cachedContent;
}
@Override @Override
public String getParameter(String name) { public String getParameter(String name) {
if (this.parameterMap != null) { if (this.parameterMap != null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment