From 23b56ca27858ba2eb6594e34b6e870d208cbad9e Mon Sep 17 00:00:00 2001 From: b2baccline <23131013+b2baccline@users.noreply.github.com> Date: Thu, 16 Jul 2020 18:58:24 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20access=20log=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20responseWrapper=EF=BC=8C=E8=AE=B0=E5=BD=95=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/handler/AdminAccessLogHandler.java | 8 +++++ .../log/model/entity/AdminAccessLog.java | 6 ++++ .../log/access/filter/AccessLogFilter.java | 10 ++++-- .../ballcat/commom/log/util/LogUtils.java | 31 +++++++++++++++++-- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/handler/AdminAccessLogHandler.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/handler/AdminAccessLogHandler.java index 26a1177e..b562908f 100644 --- a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/handler/AdminAccessLogHandler.java +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/handler/AdminAccessLogHandler.java @@ -32,6 +32,8 @@ import java.util.Optional; @RequiredArgsConstructor public class AdminAccessLogHandler implements AccessLogHandler { + private final static String APPLICATION_JSON = "application/json"; + private final AccessLogAdminSaveThread accessLogAdminSaveThread; /** @@ -65,6 +67,12 @@ public class AdminAccessLogHandler implements AccessLogHandler { adminAccessLog.setReqBody(LogUtils.getRequestBody(request)); } + // 只记录响应头为 application/json 的返回数据 + // 后台日志对于分页数据请求,不记录返回值 + if (!request.getRequestURI().endsWith("/page") && response.getContentType().contains(APPLICATION_JSON)) { + adminAccessLog.setResult(LogUtils.getResponseBody(response)); + } + // 如果登陆用户 则记录用户名和用户id Optional.ofNullable(SecurityUtils.getSysUserDetails()).map(SysUserDetails::getSysUser).ifPresent(x -> { adminAccessLog.setUserId(x.getUserId()); diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/model/entity/AdminAccessLog.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/model/entity/AdminAccessLog.java index e58f57f3..21b57379 100644 --- a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/model/entity/AdminAccessLog.java +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/log/model/entity/AdminAccessLog.java @@ -99,6 +99,12 @@ public class AdminAccessLog extends Model { @ApiModelProperty(value = "响应状态码") private Integer httpStatus; + /** + * 响应信息 + */ + @ApiModelProperty(value = "响应信息") + private String result; + /** * 错误消息 */ diff --git a/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/access/filter/AccessLogFilter.java b/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/access/filter/AccessLogFilter.java index 3c078e59..0d6b02b0 100644 --- a/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/access/filter/AccessLogFilter.java +++ b/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/access/filter/AccessLogFilter.java @@ -6,6 +6,7 @@ import com.hccake.ballcat.common.core.request.wrapper.RepeatBodyRequestWrapper; import lombok.RequiredArgsConstructor; import org.springframework.util.AntPathMatcher; import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingResponseWrapper; import javax.servlet.FilterChain; import javax.servlet.ServletException; @@ -63,12 +64,14 @@ public class AccessLogFilter extends OncePerRequestFilter { else { requestWrapper = new RepeatBodyRequestWrapper(request); } + // 包装 response,便于重复获取 body + ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); // 开始时间 Long startTime = System.currentTimeMillis(); Throwable myThrowable = null; try { - filterChain.doFilter(requestWrapper, response); + filterChain.doFilter(requestWrapper, responseWrapper); } catch (Throwable throwable) { // 记录外抛异常 @@ -87,9 +90,10 @@ public class AccessLogFilter extends OncePerRequestFilter { myThrowable = throwable; } // 生产一个日志并记录 - accessLogService.logRecord(requestWrapper, response, executionTime, myThrowable); + accessLogService.logRecord(requestWrapper, responseWrapper, executionTime, myThrowable); + // 重新写入数据到响应信息中 + responseWrapper.copyBodyToResponse(); } - } } diff --git a/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/util/LogUtils.java b/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/util/LogUtils.java index bf679758..3d25d235 100644 --- a/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/util/LogUtils.java +++ b/ballcat-starters/ballcat-spring-boot-starter-log/src/main/java/com/hccake/ballcat/commom/log/util/LogUtils.java @@ -12,9 +12,12 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.util.ContentCachingResponseWrapper; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -31,7 +34,7 @@ public class LogUtils { /** * 获取当前登陆用户名 - * @return + * @return current login user name */ public String getUsername() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -43,8 +46,8 @@ public class LogUtils { /** * 获取请求体 - * @param request - * @return + * @param request 请求体 + * @return requestBody */ public String getRequestBody(HttpServletRequest request) { String body = null; @@ -62,6 +65,28 @@ public class LogUtils { return body; } + /** + * 获取响应体 + * @param response 响应信息 + * @return responseBody 响应体 + */ + public String getResponseBody(HttpServletResponse response) { + HttpServletRequest request = getHttpServletRequest(); + try { + if (response instanceof ContentCachingResponseWrapper) { + ContentCachingResponseWrapper responseWrapper = (ContentCachingResponseWrapper) response; + // 获取响应体 + byte[] contentAsByteArray = responseWrapper.getContentAsByteArray(); + return new String(contentAsByteArray, StandardCharsets.UTF_8); + } + log.warn("对于未包装的响应体,默认不进行读取请求体,请求 uri: [{}]", request.getRequestURI()); + } + catch (Exception exception) { + log.error("获取响应体信息失败,请求 uri: [{}]", request.getRequestURI()); + } + return ""; + } + /** * 判断是否是multipart/form-data请求 * @param request 请求信息