diff --git a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/src/main/java/xtools/app/common/log/filter/HttpLogFilter.java b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/src/main/java/xtools/app/common/log/filter/HttpLogFilter.java index 19d3ac4..95951da 100644 --- a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/src/main/java/xtools/app/common/log/filter/HttpLogFilter.java +++ b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/src/main/java/xtools/app/common/log/filter/HttpLogFilter.java @@ -18,6 +18,7 @@ import xtools.boot.core.utils.PathPatternUtils; import xtools.boot.core.utils.SpringContextUtils; import xtools.boot.log.LogBus; import xtools.boot.log.enums.LogBusBaseType; +import xtools.boot.thread.utils.VirtualThreadTaskUtils; import xtools.boot.web.filter.base.BaseFilter; import xtools.core.CollectionUtils; import xtools.core.enums.LogLevel; @@ -83,13 +84,14 @@ public class HttpLogFilter extends BaseFilter implements Ordered, BaseParams { @NonNull HttpServletResponse response, @NonNull FilterChain filterChain ) throws ServletException, IOException { - long startTime = System.currentTimeMillis(); // 获取访问 uri String uri = HeaderUtils.getUri(request); if (PathPatternUtils.match(LOG_WHITE_LIST, uri)) { filterChain.doFilter(request, response); return; } + // 开始时间 + long startTime = System.currentTimeMillis(); // 获取请求日志 JSONObject log = getRequestLog(request); @@ -105,28 +107,45 @@ public class HttpLogFilter extends BaseFilter implements Ordered, BaseParams { // 获取请求参数 Object reqParam = getContent(requestWrapper.getContentAsByteArray()); + Object respData; + if (!PathPatternUtils.match(RESP_WHITE_LIST, uri)) { + // 获取响应内容 + respData = getContent(responseWrapper.getContentAsByteArray()); + } else { + respData = "ignore"; + } + // 将内容复制回原始响应 + responseWrapper.copyBodyToResponse(); + // 获取响应时间 + long execTime = System.currentTimeMillis() - startTime; + // 保存日志 + VirtualThreadTaskUtils.execute(() -> saveResponseLog(log, reqParam, respData, execTime)); + } + + /** + * 保存响应日志 + * + * @param log 日志 + * @param reqParam 请求参数 + * @param respData 响应数据 + * @param execTime 执行时间 + */ + private void saveResponseLog(JSONObject log, Object reqParam, Object respData, long execTime) { log.put("reqBody", reqParam); + log.put("respData", respData); + log.put("execTime", execTime); // 处理异常日志 LogLevel level = LogLevel.INFO; Boolean printLog = null; - if (!PathPatternUtils.match(RESP_WHITE_LIST, uri)) { - // 获取响应内容 - Object respData = getContent(responseWrapper.getContentAsByteArray()); - log.put("respData", respData); - if (respData instanceof JSONObject respJson) { - if (Objects.equals(respJson.getBoolean("success"), false)) { - level = LogLevel.ERROR; - if (Objects.equals(respJson.getInteger("code"), 404)) { - printLog = false; - } + if (respData instanceof JSONObject respJson) { + if (Objects.equals(respJson.getBoolean("success"), false)) { + level = LogLevel.ERROR; + if (Objects.equals(respJson.getInteger("code"), 404)) { + printLog = false; } } } - long endTime = System.currentTimeMillis(); - log.put("execTime", endTime - startTime); - // 将内容复制回原始响应 - responseWrapper.copyBodyToResponse(); // 记录响应日志 LogBus logBus = LogBus.init(level, LogBusBaseType.HTTP_REQUEST).data(log); if (Objects.nonNull(printLog)) {