|
@@ -1,11 +1,21 @@
|
|
|
package cn.iocoder.dashboard.framework.logger.apilog.core.filter;
|
|
|
|
|
|
+import cn.hutool.core.exceptions.ExceptionUtil;
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.extra.servlet.ServletUtil;
|
|
|
+import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
|
|
|
+import cn.iocoder.dashboard.common.pojo.CommonResult;
|
|
|
+import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService;
|
|
|
import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO;
|
|
|
+import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils;
|
|
|
import cn.iocoder.dashboard.framework.web.config.WebProperties;
|
|
|
+import cn.iocoder.dashboard.framework.web.core.util.WebFrameworkUtils;
|
|
|
+import cn.iocoder.dashboard.util.date.DateUtils;
|
|
|
+import cn.iocoder.dashboard.util.json.JsonUtils;
|
|
|
import cn.iocoder.dashboard.util.servlet.ServletUtils;
|
|
|
-import lombok.AllArgsConstructor;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.web.filter.OncePerRequestFilter;
|
|
|
|
|
|
import javax.servlet.FilterChain;
|
|
@@ -21,14 +31,19 @@ import java.util.Map;
|
|
|
*
|
|
|
* @author 芋道源码
|
|
|
*/
|
|
|
-@AllArgsConstructor
|
|
|
+@RequiredArgsConstructor
|
|
|
@Slf4j
|
|
|
public class ApiAccessLogFilter extends OncePerRequestFilter {
|
|
|
|
|
|
private final WebProperties webProperties;
|
|
|
+ private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
|
|
|
+
|
|
|
+ @Value("${spring.application.name}")
|
|
|
+ private String applicationName;
|
|
|
|
|
|
@Override
|
|
|
protected boolean shouldNotFilter(HttpServletRequest request) {
|
|
|
+ // 只过滤 API 请求的地址
|
|
|
return !request.getRequestURI().startsWith(webProperties.getApiPrefix());
|
|
|
}
|
|
|
|
|
@@ -56,8 +71,8 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
|
|
|
private void createApiAccessLog(HttpServletRequest request, Date startTime,
|
|
|
Map<String, String> queryString, String requestBody, Exception ex) {
|
|
|
try {
|
|
|
- ApiAccessLogCreateDTO createDTO = this.buildApiAccessLogDTO(request, startTime, queryString, requestBody, ex);
|
|
|
-
|
|
|
+ ApiAccessLogCreateDTO accessLog = this.buildApiAccessLogDTO(request, startTime, queryString, requestBody, ex);
|
|
|
+ apiAccessLogFrameworkService.createApiAccessLogAsync(accessLog);
|
|
|
} catch (Exception e) {
|
|
|
log.error("[createApiAccessLog][url({}) 发生异常]", request.getRequestURI(), ex);
|
|
|
}
|
|
@@ -65,7 +80,36 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
|
|
|
|
|
|
private ApiAccessLogCreateDTO buildApiAccessLogDTO(HttpServletRequest request, Date startTime,
|
|
|
Map<String, String> queryString, String requestBody, Exception ex) {
|
|
|
- return null;
|
|
|
+ ApiAccessLogCreateDTO accessLog = new ApiAccessLogCreateDTO();
|
|
|
+ // 处理用户信息
|
|
|
+ accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
|
|
|
+ accessLog.setUserType(WebFrameworkUtils.getUsrType(request));
|
|
|
+ // 设置访问结果
|
|
|
+ CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
|
|
|
+ if (result != null) {
|
|
|
+ accessLog.setResultCode(result.getCode());
|
|
|
+ accessLog.setResultMsg(result.getMsg());
|
|
|
+ } else if (ex != null) {
|
|
|
+ accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode());
|
|
|
+ accessLog.setResultMsg(ExceptionUtil.getRootCauseMessage(ex));
|
|
|
+ } else {
|
|
|
+ accessLog.setResultCode(0);
|
|
|
+ accessLog.setResultMsg("");
|
|
|
+ }
|
|
|
+ // 设置其它字段
|
|
|
+ accessLog.setTraceId(TracerUtils.getTraceId());
|
|
|
+ accessLog.setApplicationName(applicationName);
|
|
|
+ accessLog.setRequestUrl(request.getRequestURI());
|
|
|
+ Map<String, Object> requestParams = MapUtil.<String, Object>builder().put("query", queryString).put("body", requestBody).build();
|
|
|
+ accessLog.setRequestParams(JsonUtils.toJsonString(requestParams));
|
|
|
+ accessLog.setRequestMethod(request.getMethod());
|
|
|
+ accessLog.setUserAgent(ServletUtils.getUserAgent(request));
|
|
|
+ accessLog.setUserIp(ServletUtil.getClientIP(request));
|
|
|
+ // 持续时间
|
|
|
+ accessLog.setStartTime(startTime);
|
|
|
+ accessLog.setEndTime(new Date());
|
|
|
+ accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getStartTime()));
|
|
|
+ return accessLog;
|
|
|
}
|
|
|
|
|
|
}
|