Procházet zdrojové kódy

优化日志处理逻辑

Woody před 4 týdny
rodič
revize
dbc66cf833

+ 33 - 217
framework-base/src/main/java/com/chelvc/framework/base/context/LoggingContextHolder.java

@@ -29,6 +29,17 @@ public final class LoggingContextHolder {
     private LoggingContextHolder() {
     }
 
+    /**
+     * 获取日志处理器
+     *
+     * @param name 处理器名称
+     * @return 处理器实例
+     */
+    public static Logger logger(@NonNull String name) {
+        ILoggerFactory factory = LoggerFactory.getILoggerFactory();
+        return factory instanceof LoggerContext ? ((LoggerContext) factory).exists(name) : factory.getLogger(name);
+    }
+
     /**
      * 获取日志信息
      *
@@ -84,40 +95,16 @@ public final class LoggingContextHolder {
         return buffer.toString();
     }
 
-    /**
-     * 获取日志信息
-     *
-     * @param request 请求对象
-     * @param t       异常对象实例
-     * @return 消息内容
-     */
-    public static String message(ServletRequest request, Throwable t) {
-        return message(request, true, t);
-    }
-
-    /**
-     * 获取日志信息
-     *
-     * @param request 请求对象
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     * @return 消息内容
-     */
-    public static String message(ServletRequest request, boolean embody, Throwable t) {
-        return message(request, embody, ObjectUtils.ifNull(t, Throwable::getMessage));
-    }
-
     /**
      * 获取日志信息
      *
      * @param request  请求对象
-     * @param embody   是否包含请求体
      * @param messages 消息内容数组
      * @return 消息内容
      */
-    public static String message(ServletRequest request, boolean embody, @NonNull Object... messages) {
+    public static String message(ServletRequest request, @NonNull Object... messages) {
         if (!(request instanceof HttpServletRequest)) {
-            return message(null, messages);
+            return message((String) null, messages);
         }
         StringBuilder endpoint = new StringBuilder();
         endpoint.append(((HttpServletRequest) request).getMethod());
@@ -127,8 +114,8 @@ public final class LoggingContextHolder {
         if (StringUtils.notEmpty(query)) {
             endpoint.append("?").append(query);
         }
-        if (embody && HttpUtils.isBodyType(request) && !HttpUtils.isStreamBody(request)) {
-            String body = HttpUtils.getBody(request);
+        if (HttpUtils.isBodyType(request) && !HttpUtils.isStreamBody(request)) {
+            String body = HttpUtils.getBody(request, true);
             if (StringUtils.notEmpty(body)) {
                 endpoint.append(StringUtils.SPACE);
                 endpoint.append(StringUtils.replace(body, '\n', '\0'));
@@ -142,13 +129,12 @@ public final class LoggingContextHolder {
      *
      * @param logger  日志处理器
      * @param request 请求对象
-     * @param embody  是否包含请求体
      * @param t       异常对象实例
      * @return 消息内容
      */
-    private static String message(Logger logger, ServletRequest request, boolean embody, Throwable t) {
+    public static String message(@NonNull Logger logger, ServletRequest request, Throwable t) {
         try {
-            return message(request, embody, t);
+            return t == null ? message(request) : message(request, t.getMessage());
         } catch (Exception e) {
             logger.error("Logging context message build failed", e);
             return ObjectUtils.ifNull(t, Throwable::getMessage);
@@ -160,13 +146,12 @@ public final class LoggingContextHolder {
      *
      * @param logger   日志处理器
      * @param request  请求对象
-     * @param embody   是否包含请求体
      * @param messages 消息内容数组
      * @return 消息内容
      */
-    private static String message(Logger logger, ServletRequest request, boolean embody, Object... messages) {
+    public static String message(@NonNull Logger logger, ServletRequest request, @NonNull Object... messages) {
         try {
-            return message(request, embody, messages);
+            return message(request, messages);
         } catch (Exception e) {
             logger.error("Logging context message build failed", e);
             if (ObjectUtils.isEmpty(messages)) {
@@ -185,17 +170,6 @@ public final class LoggingContextHolder {
         }
     }
 
-    /**
-     * 获取日志处理器
-     *
-     * @param name 处理器名称
-     * @return 处理器实例
-     */
-    public static Logger logger(@NonNull String name) {
-        ILoggerFactory factory = LoggerFactory.getILoggerFactory();
-        return factory instanceof LoggerContext ? ((LoggerContext) factory).exists(name) : factory.getLogger(name);
-    }
-
     /**
      * 打印正常日志
      *
@@ -203,18 +177,7 @@ public final class LoggingContextHolder {
      * @param messages 消息数组
      */
     public static void info(@NonNull Logger logger, @NonNull Object... messages) {
-        info(logger, true, messages);
-    }
-
-    /**
-     * 打印正常日志
-     *
-     * @param logger   日志处理器
-     * @param embody   是否包含请求体
-     * @param messages 消息数组
-     */
-    public static void info(@NonNull Logger logger, boolean embody, @NonNull Object... messages) {
-        info(logger, SessionContextHolder.getRequest(), embody, messages);
+        info(logger, SessionContextHolder.getRequest(), messages);
     }
 
     /**
@@ -225,20 +188,7 @@ public final class LoggingContextHolder {
      * @param messages 消息数组
      */
     public static void info(@NonNull Logger logger, ServletRequest request, @NonNull Object... messages) {
-        info(logger, request, true, messages);
-    }
-
-    /**
-     * 打印正常日志
-     *
-     * @param logger   日志处理器
-     * @param request  请求对象
-     * @param embody   是否包含请求体
-     * @param messages 消息数组
-     */
-    public static void info(@NonNull Logger logger, ServletRequest request, boolean embody,
-                            @NonNull Object... messages) {
-        logger.info(message(logger, request, embody, messages));
+        logger.info(message(logger, request, messages));
     }
 
     /**
@@ -248,18 +198,7 @@ public final class LoggingContextHolder {
      * @param t      异常对象实例
      */
     public static void warn(@NonNull Logger logger, @NonNull Throwable t) {
-        warn(logger, true, t);
-    }
-
-    /**
-     * 打印告警日志
-     *
-     * @param logger 日志处理器
-     * @param embody 是否包含请求体
-     * @param t      异常对象实例
-     */
-    public static void warn(@NonNull Logger logger, boolean embody, @NonNull Throwable t) {
-        warn(logger, embody, t, false);
+        warn(logger, t, false);
     }
 
     /**
@@ -270,19 +209,7 @@ public final class LoggingContextHolder {
      * @param tracing 是否打印堆栈
      */
     public static void warn(@NonNull Logger logger, @NonNull Throwable t, boolean tracing) {
-        warn(logger, true, t, tracing);
-    }
-
-    /**
-     * 打印告警日志
-     *
-     * @param logger  日志处理器
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     * @param tracing 是否打印堆栈
-     */
-    public static void warn(@NonNull Logger logger, boolean embody, @NonNull Throwable t, boolean tracing) {
-        warn(logger, SessionContextHolder.getRequest(), embody, t, tracing);
+        warn(logger, SessionContextHolder.getRequest(), t, tracing);
     }
 
     /**
@@ -293,19 +220,7 @@ public final class LoggingContextHolder {
      * @param t       异常对象实例
      */
     public static void warn(@NonNull Logger logger, ServletRequest request, @NonNull Throwable t) {
-        warn(logger, request, true, t);
-    }
-
-    /**
-     * 打印告警日志
-     *
-     * @param logger  日志处理器
-     * @param request 请求对象
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     */
-    public static void warn(@NonNull Logger logger, ServletRequest request, boolean embody, @NonNull Throwable t) {
-        warn(logger, request, embody, t, false);
+        warn(logger, request, t, false);
     }
 
     /**
@@ -317,24 +232,10 @@ public final class LoggingContextHolder {
      * @param tracing 是否打印堆栈
      */
     public static void warn(@NonNull Logger logger, ServletRequest request, @NonNull Throwable t, boolean tracing) {
-        warn(logger, request, true, t, tracing);
-    }
-
-    /**
-     * 打印告警日志
-     *
-     * @param logger  日志处理器
-     * @param request 请求对象
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     * @param tracing 是否打印堆栈
-     */
-    public static void warn(@NonNull Logger logger, ServletRequest request, boolean embody, @NonNull Throwable t,
-                            boolean tracing) {
         if (tracing) {
-            logger.warn(message(logger, request, embody, t), t);
+            logger.warn(message(logger, request, t), t);
         } else {
-            logger.warn(message(logger, request, embody, t));
+            logger.warn(message(logger, request, t));
         }
     }
 
@@ -346,20 +247,7 @@ public final class LoggingContextHolder {
      * @param messages 消息数组
      */
     public static void warn(@NonNull Logger logger, ServletRequest request, @NonNull Object... messages) {
-        warn(logger, request, true, messages);
-    }
-
-    /**
-     * 打印告警日志
-     *
-     * @param logger   日志处理器
-     * @param request  请求对象
-     * @param embody   是否包含请求体
-     * @param messages 消息数组
-     */
-    public static void warn(@NonNull Logger logger, ServletRequest request, boolean embody,
-                            @NonNull Object... messages) {
-        logger.warn(message(logger, request, embody, messages));
+        logger.warn(message(logger, request, messages));
     }
 
     /**
@@ -369,18 +257,7 @@ public final class LoggingContextHolder {
      * @param t      异常对象实例
      */
     public static void error(@NonNull Logger logger, @NonNull Throwable t) {
-        error(logger, true, t);
-    }
-
-    /**
-     * 打印错误日志
-     *
-     * @param logger 日志处理器
-     * @param embody 是否包含请求体
-     * @param t      异常对象实例
-     */
-    public static void error(@NonNull Logger logger, boolean embody, @NonNull Throwable t) {
-        error(logger, SessionContextHolder.getRequest(), embody, t);
+        error(logger, SessionContextHolder.getRequest(), t);
     }
 
     /**
@@ -391,19 +268,7 @@ public final class LoggingContextHolder {
      * @param t       异常对象实例
      */
     public static void error(@NonNull Logger logger, ServletRequest request, @NonNull Throwable t) {
-        error(logger, request, true, t);
-    }
-
-    /**
-     * 打印错误日志
-     *
-     * @param logger  日志处理器
-     * @param request 请求对象
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     */
-    public static void error(@NonNull Logger logger, ServletRequest request, boolean embody, @NonNull Throwable t) {
-        logger.error(message(logger, request, embody, t), t);
+        logger.error(message(logger, request, t), t);
     }
 
     /**
@@ -414,20 +279,7 @@ public final class LoggingContextHolder {
      * @param messages 消息数组
      */
     public static void error(@NonNull Logger logger, ServletRequest request, @NonNull Object... messages) {
-        error(logger, request, true, messages);
-    }
-
-    /**
-     * 打印错误日志
-     *
-     * @param logger   日志处理器
-     * @param request  请求对象
-     * @param embody   是否包含请求体
-     * @param messages 消息数组
-     */
-    public static void error(@NonNull Logger logger, ServletRequest request, boolean embody,
-                             @NonNull Object... messages) {
-        logger.error(message(logger, request, embody, messages));
+        logger.error(message(logger, request, messages));
     }
 
     /**
@@ -437,18 +289,7 @@ public final class LoggingContextHolder {
      * @param t      异常对象实例
      */
     public static void debug(@NonNull Logger logger, @NonNull Throwable t) {
-        debug(logger, true, t);
-    }
-
-    /**
-     * 打印调试日志
-     *
-     * @param logger 日志处理器
-     * @param embody 是否包含请求体
-     * @param t      异常对象实例
-     */
-    public static void debug(@NonNull Logger logger, boolean embody, @NonNull Throwable t) {
-        debug(logger, SessionContextHolder.getRequest(), embody, t);
+        debug(logger, SessionContextHolder.getRequest(), t);
     }
 
     /**
@@ -459,20 +300,8 @@ public final class LoggingContextHolder {
      * @param t       异常对象实例
      */
     public static void debug(@NonNull Logger logger, ServletRequest request, @NonNull Throwable t) {
-        debug(logger, request, true, t);
-    }
-
-    /**
-     * 打印调试日志
-     *
-     * @param logger  日志处理器
-     * @param request 请求对象
-     * @param embody  是否包含请求体
-     * @param t       异常对象实例
-     */
-    public static void debug(@NonNull Logger logger, ServletRequest request, boolean embody, @NonNull Throwable t) {
         if (logger.isDebugEnabled()) {
-            logger.debug(message(logger, request, embody, t), t);
+            logger.debug(message(logger, request, t), t);
         }
     }
 
@@ -484,21 +313,8 @@ public final class LoggingContextHolder {
      * @param messages 消息数组
      */
     public static void debug(@NonNull Logger logger, ServletRequest request, @NonNull Object... messages) {
-        debug(logger, request, true, messages);
-    }
-
-    /**
-     * 打印调试日志
-     *
-     * @param logger   日志处理器
-     * @param request  请求对象
-     * @param embody   是否包含请求体
-     * @param messages 消息数组
-     */
-    public static void debug(@NonNull Logger logger, ServletRequest request, boolean embody,
-                             @NonNull Object... messages) {
         if (logger.isDebugEnabled()) {
-            logger.debug(message(logger, request, embody, messages));
+            logger.debug(message(logger, request, messages));
         }
     }
 }

+ 2 - 2
framework-base/src/main/java/com/chelvc/framework/base/interceptor/GlobalExceptionInterceptor.java

@@ -89,9 +89,9 @@ public class GlobalExceptionInterceptor extends AbstractErrorController implemen
             chain.doFilter(request, response);
         } catch (Exception e) {
             if (this.isClientAbortException(e)) {
-                LoggingContextHolder.warn(log, request, false, e, this.isWarnTracing());
+                LoggingContextHolder.warn(log, request, e, this.isWarnTracing());
             } else {
-                LoggingContextHolder.error(log, request, false, e);
+                LoggingContextHolder.error(log, request, e);
             }
         }
     }

+ 41 - 26
framework-base/src/main/java/com/chelvc/framework/base/util/HttpUtils.java

@@ -16,6 +16,7 @@ import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -225,32 +226,6 @@ public final class HttpUtils {
         return HostUtils.DEFAULT_LOCAL_ADDRESS_IPV6.equals(host) ? HostUtils.LOCAL_ADDRESS : host;
     }
 
-    /**
-     * 获取请求体
-     *
-     * @param request 请求对象
-     * @return 请求体字符串
-     */
-    public static String getBody(@NonNull ServletRequest request) {
-        // 从请求包装器中直接获取请求体
-        if (request instanceof RequestCachingInterceptor.CachingRequestWrapper) {
-            return ((RequestCachingInterceptor.CachingRequestWrapper) request).getBody();
-        }
-
-        // 从数据流中获取请求体
-        byte[] bytes;
-        try (InputStream input = request.getInputStream()) {
-            if (input instanceof RequestCachingInterceptor.CachingInputStream) {
-                bytes = ((RequestCachingInterceptor.CachingInputStream) input).bytes();
-            } else {
-                bytes = FileUtils.getBytes(input);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        return bytes.length == 0 ? null : new String(bytes);
-    }
-
     /**
      * 判断是否是请求体类型
      *
@@ -292,6 +267,46 @@ public final class HttpUtils {
                 || type.startsWith("application/grpc") || type.startsWith("application/octet-stream"));
     }
 
+    /**
+     * 获取请求体
+     *
+     * @param request 请求对象
+     * @return 请求体字符串
+     */
+    public static String getBody(@NonNull ServletRequest request) {
+        return getBody(request, false);
+    }
+
+    /**
+     * 获取请求体
+     *
+     * @param request 请求对象
+     * @param opening 是否忽略关闭流
+     * @return 请求体字符串
+     */
+    public static String getBody(@NonNull ServletRequest request, boolean opening) {
+        // 从请求包装器中直接获取请求体
+        if (request instanceof RequestCachingInterceptor.CachingRequestWrapper) {
+            return ((RequestCachingInterceptor.CachingRequestWrapper) request).getBody();
+        }
+
+        // 从数据流中获取请求体
+        byte[] bytes;
+        try (InputStream input = request.getInputStream()) {
+            if (input instanceof RequestCachingInterceptor.CachingInputStream) {
+                bytes = ((RequestCachingInterceptor.CachingInputStream) input).bytes();
+            } else {
+                bytes = FileUtils.getBytes(input);
+            }
+        } catch (IOException e) {
+            if (opening && Objects.equals(e.getMessage(), "Stream closed")) {
+                return null;
+            }
+            throw new RuntimeException(e);
+        }
+        return bytes.length == 0 ? null : new String(bytes);
+    }
+
     /**
      * 获取表单请求参数
      *