浏览代码

Merge branch 'feature-优化日志-20220719' into feature-restructure-20220725

dengsixing 3 年之前
父节点
当前提交
7ea4394e9a

+ 2 - 19
src/main/java/com/fdkankan/gateway/exception/JsonErrorWebExceptionHandler.java

@@ -31,29 +31,12 @@ public class JsonErrorWebExceptionHandler extends DefaultErrorWebExceptionHandle
     @Override
     protected Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
 
-        // 这里其实可以根据异常类型进行定制化逻辑
-        Throwable error = super.getError(request).getCause();
+        //这里可以根据异常类型进行定制化逻辑
+        Throwable error = super.getError(request);
         Map<String, Object> errorAttributes = new HashMap<>(8);
 
         Integer code = ServerCode.SYSTEM_ERROR.code();
         String message = ServerCode.SYSTEM_ERROR.message();
-        if(error instanceof NotLoginException){
-            code = 201;
-            message = "请重新登录";
-        }else if(error instanceof NotRoleException){
-            code = 202;
-            message = "无此角色:" + ((NotRoleException) error).getRole();
-        }else if(error instanceof NotPermissionException){
-            code = 201;
-            message = "无此权限:" + ((NotPermissionException) error).getPermission();
-        }else if(error instanceof DisableLoginException){
-            code = 201;
-            message = "账号被封禁:" + ((DisableLoginException) error).getDisableTime() + "秒后解封";
-        } else if(error instanceof BusinessException){
-           code = ((BusinessException) error).getCode();
-           message = error.getMessage();
-        }
-
         errorAttributes.put("code", code);
         errorAttributes.put("message", message);
         errorAttributes.put("method", request.methodName());

+ 30 - 7
src/main/java/com/fdkankan/gateway/filter/AccessLogFilter.java

@@ -1,14 +1,18 @@
 package com.fdkankan.gateway.filter;
 
+import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.fdkankan.common.constant.LoginType;
+import com.fdkankan.common.constant.ServerCode;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.gateway.log.GatewayLog;
 import com.fdkankan.gateway.util.WebUtil;
 import com.yomahub.tlog.context.TLogContext;
+import java.io.IOException;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
 import org.reactivestreams.Publisher;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@@ -99,11 +103,13 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
         if(MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)
             || MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)){
             return writeBodyLog(exchange, chain, gatewayLog);
-        }else{
+        }
+        else{
             return writeBasicLog(exchange, chain, gatewayLog);
         }
     }
 
+
     private Mono<Void> writeBasicLog(ServerWebExchange exchange, GatewayFilterChain chain, GatewayLog accessLog) {
         StringBuilder builder = new StringBuilder();
         MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
@@ -116,13 +122,16 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
         ServerHttpResponseDecorator decoratedResponse = recordResponseLog(exchange, accessLog);
 
         return chain.filter(exchange.mutate().response(decoratedResponse).build())
+                .doOnError(e->{
+                    // 打印日志
+                    writeBadAccessLog(accessLog, e);
+                })
                 .then(Mono.fromRunnable(() -> {
                     // 打印日志
                     writeAccessLog(accessLog);
                 }));
     }
 
-
     /**
      * 参考: org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory
      * @param exchange
@@ -161,13 +170,27 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
                     // 记录普通的
                     return chain.filter(exchange.mutate().request(decoratedRequest).response(decoratedResponse).build())
-                            .then(Mono.fromRunnable(() -> {
-                                // 打印日志
-                                writeAccessLog(gatewayLog);
-                            }));
+                        .doOnError(e->{
+                            // 打印日志
+                            writeBadAccessLog(gatewayLog, e);
+                        })
+                        .then(Mono.fromRunnable(() -> {
+                            // 打印日志
+                            writeAccessLog(gatewayLog);
+                        }));
                 }));
     }
 
+    private void writeBadAccessLog(GatewayLog gatewayLog, Throwable e){
+        gatewayLog.setResponseTime(Calendar.getInstance().getTime());
+        gatewayLog.setExecuteTime(gatewayLog.getResponseTime().getTime()-gatewayLog.getRequestTime().getTime());
+        gatewayLog.setCode(ServerCode.SYSTEM_ERROR.code());
+        gatewayLog.setMessage(ServerCode.SYSTEM_ERROR.message());
+        gatewayLog.setResponseData(ExceptionUtil.stacktraceToString(e, 3000));
+        this.writeAccessLog(gatewayLog);
+
+    }
+
     /**
      * 打印日志
      * @param gatewayLog 网关日志
@@ -175,7 +198,7 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
     private void writeAccessLog(GatewayLog gatewayLog) {
         log.info(JSON.toJSONString(gatewayLog));
         //日志写入mongodb
-        mongoTemplate.insert(gatewayLog, "gatewayLog");
+//        mongoTemplate.insert(gatewayLog, "gatewayLog");
     }