请使用过滤器打日志吧
package com.xf.config; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.springframework.http.MediaType; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; @Slf4j public class RequestBodyWrapper extends HttpServletRequestWrapper { private String body; public static final String REQUEST_ID_KEY = "request-id"; public RequestBodyWrapper(HttpServletRequest request) { super(request); HttpServletRequest httpServletRequest = request; String method = httpServletRequest.getMethod(); String contentType = httpServletRequest.getContentType(); if (StrUtil.isNotEmpty(contentType)) { contentType = contentType.toLowerCase(); } // String token = request.getHeader("token"); // String requestId = getRequestId(request); // MDC.put(REQUEST_ID_KEY, requestId); // Dict reqMap = HttpServletRequestUtil.getAllRequestInfo(); // if (StrUtil.isNotBlank(token)) { // // 解析token // JSONObject payload = JWTUtils.getPayload(token).getClaimsJson(); // reqMap.set("payload", payload); // } // reqMap.set("requestId", requestId); // TraceId.logTraceID.set(requestId); // log.info(JSONUtil.toJsonStr(reqMap)); // 该方法处理 POST请求并且contentType为application/json格式的 if (method.toUpperCase().equals("POST") && StrUtil.isNotEmpty(contentType) && contentType.contains(MediaType.APPLICATION_JSON_VALUE)) { body = getBodyString(request); } } /** * 获取请求Body */ public String getBodyString(final ServletRequest request) { StringBuilder sb = new StringBuilder(); InputStream inputStream = null; BufferedReader reader = null; try { inputStream = cloneInputStream(request.getInputStream()); reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); String line = ""; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } String ret = sb.toString(); log.info(ret); return ret; } /** * Description: 复制输入流 */ public InputStream cloneInputStream(ServletInputStream inputStream) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; try { while ((len = inputStream.read(buffer)) > -1) { byteArrayOutputStream.write(buffer, 0, len); } byteArrayOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); } return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); } /** * 这段代码就是将request的数据又重新写回流中, 后续需要调用getInputStream()方法时,就能获取到数据 * */ @Override public ServletInputStream getInputStream() throws IOException { // 这一步很关键 保证后续操作能获取到流数据 final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( body.getBytes(StandardCharsets.UTF_8)); return new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; } }
package com.xf.config; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Component; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; /** * @ClassName: HttpReplaceFilter * @Description: 过滤器 * @Date: 2020/6/16 14:37 */ @WebFilter(filterName = "HttpLogFilter", urlPatterns = "/*") @Component public class HttpLogFilter implements Filter { public static final String REQUEST_ID_KEY = "request-id"; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; servletRequest = new RequestBodyWrapper(httpServletRequest); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { Filter.super.destroy(); } public static String getRequestId(HttpServletRequest request) { String requestId; String parameterRequestId = request.getParameter(REQUEST_ID_KEY); String headerRequestId = request.getHeader(REQUEST_ID_KEY); // 根据请求参数或请求头判断是否有“request-id”,有则使用,无则创建 if (parameterRequestId == null && headerRequestId == null) { requestId = DateUtil.format(new Date(), "yyyyMMdd_HHmmss_SSS") + IdUtil.simpleUUID().substring(0, 5); } else { requestId = parameterRequestId != null ? parameterRequestId : headerRequestId; } return requestId; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)