From cbb0c98f987a69ed3d23d30d65799f1b426e32d2 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期一, 11 十月 2021 17:59:27 +0800
Subject: [PATCH] add [重磅更新] 增加分布式日志框架 TLog

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java                   |   11 ++
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java                        |   49 ++++++++++++
 ruoyi-admin/src/main/resources/logback.xml                                                      |   10 +-
 pom.xml                                                                                         |   30 +++++++
 ruoyi-admin/src/main/resources/application.yml                                                  |    4 +
 ruoyi-common/pom.xml                                                                            |   15 +++
 ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java |   85 +++++++++++++++++++++
 README.md                                                                                       |    1 
 8 files changed, 200 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index c910560..fad886f 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,7 @@
 | 鍒嗗竷寮忛檺娴� | Redisson | [Redisson鏂囨。](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 鍏ㄥ眬銆佽姹侷P銆侀泦缇D 澶氱闄愭祦 |
 | 鍒嗗竷寮忛攣 | Lock4j | [Lock4j瀹樼綉](https://gitee.com/baomidou/lock4j) | 娉ㄨВ閿併�佸伐鍏烽攣 澶氱澶氭牱 |
 | 鍒嗗竷寮忓箓绛� | Lock4j | [Lock4j鏂囨。](https://gitee.com/baomidou/lock4j) | 鍩轰簬鍒嗗竷寮忛攣瀹炵幇 |
+| 鍒嗗竷寮忔棩蹇� | TLog | [TLog鏂囨。](https://yomahub.com/tlog/docs) | 鏀寔璺熻釜閾捐矾鏃ュ織璁板綍銆佹�ц兘鍒嗘瀽銆侀摼璺帓鏌� |
 | 鏂囦欢瀛樺偍 | Minio | [Minio鏂囨。](https://docs.min.io/) | 鏈湴瀛樺偍 |
 | 鏂囦欢瀛樺偍 | 涓冪墰銆侀樋閲屻�佽吘璁� | [OSS浣跨敤鏂囨。](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4359146&doc_id=1469725) | 浜戝瓨鍌� |
 | 鐩戞帶妗嗘灦 | SpringBoot-Admin | [SpringBoot-Admin鏂囨。](https://codecentric.github.io/spring-boot-admin/current/) | 鍏ㄦ柟浣嶆湇鍔$洃鎺� |
diff --git a/pom.xml b/pom.xml
index 6fa31db..c35d131 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,6 +36,7 @@
         <redisson.version>3.16.3</redisson.version>
         <lock4j.version>2.2.1</lock4j.version>
         <dynamic-ds.version>3.4.1</dynamic-ds.version>
+        <tlog.version>1.3.2</tlog.version>
 
         <!-- jdk11 缂哄け渚濊禆 jaxb-->
         <jaxb.version>3.0.1</jaxb.version>
@@ -204,6 +205,35 @@
                 <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
                 <version>${lock4j.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-spring-boot-configuration</artifactId>
+                <version>${tlog.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-webroot</artifactId>
+                <version>${tlog.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>javassist</artifactId>
+                        <groupId>org.javassist</groupId>
+                    </exclusion>
+                    <exclusion>
+                        <artifactId>guava</artifactId>
+                        <groupId>com.google.guava</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <dependency>
+                <groupId>com.yomahub</groupId>
+                <artifactId>tlog-feign</artifactId>
+                <version>${tlog.version}</version>
+            </dependency>
+
             <!-- 瀹氭椂浠诲姟-->
             <dependency>
                 <groupId>com.ruoyi</groupId>
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 145469d..dd1c6ba 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -59,6 +59,10 @@
     org.springframework: warn
   config: classpath:logback.xml
 
+# tlog 鍏ㄥ眬璁块棶鎬ц兘鎷︽埅
+tlog:
+  enable-invoke-time-print: true
+
 # Spring閰嶇疆
 spring:
   application:
diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml
index c939785..33a1697 100644
--- a/ruoyi-admin/src/main/resources/logback.xml
+++ b/ruoyi-admin/src/main/resources/logback.xml
@@ -7,7 +7,7 @@
 
 	<!-- 鎺у埗鍙拌緭鍑� -->
 	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 			<pattern>${console.log.pattern}</pattern>
             <charset>utf-8</charset>
 		</encoder>
@@ -22,7 +22,7 @@
             <!-- 鏃ュ織鏈�澶� 1澶� -->
             <maxHistory>1</maxHistory>
         </rollingPolicy>
-        <encoder>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
             <pattern>${log.pattern}</pattern>
             <charset>utf-8</charset>
         </encoder>
@@ -42,7 +42,7 @@
 			<!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
 			<maxHistory>60</maxHistory>
 		</rollingPolicy>
-		<encoder>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 		<filter class="ch.qos.logback.classic.filter.LevelFilter">
@@ -64,7 +64,7 @@
 			<!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
 			<maxHistory>60</maxHistory>
         </rollingPolicy>
-        <encoder>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
             <pattern>${log.pattern}</pattern>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
@@ -86,7 +86,7 @@
             <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
             <maxHistory>60</maxHistory>
         </rollingPolicy>
-        <encoder>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index f4f7ab9..dd9c182 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -156,6 +156,21 @@
             <groupId>com.baomidou</groupId>
             <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-spring-boot-configuration</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-webroot</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-feign</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java
new file mode 100644
index 0000000..e2120bf
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java
@@ -0,0 +1,85 @@
+package com.ruoyi.framework.Interceptor;
+
+import cn.hutool.core.map.MapUtil;
+import com.alibaba.ttl.TransmittableThreadLocal;
+import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.yomahub.tlog.context.TLogContext;
+import com.yomahub.tlog.web.interceptor.AbsTLogWebHandlerMethodInterceptor;
+import com.yomahub.tlog.web.wrapper.RequestWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.StopWatch;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * 閲嶅啓Tlog web鐨勮皟鐢ㄦ椂闂寸粺璁℃嫤鎴櫒
+ *
+ * @author Lion Li
+ * @since 3.3.0
+ */
+@Slf4j
+public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterceptor {
+
+    private final TransmittableThreadLocal<StopWatch> invokeTimeTL = new TransmittableThreadLocal<>();
+
+    @Override
+    public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (TLogContext.enableInvokeTimePrint()) {
+            String url = request.getMethod() + " " + request.getRequestURI();
+
+            // 鎵撳嵃璇锋眰鍙傛暟
+            if (isJsonRequest(request)) {
+                    String jsonParam = new RequestWrapper(request).getBodyString();
+                    log.info("[PLUS]寮�濮嬭姹� => URL[{}],鍙傛暟绫诲瀷[json],鍙傛暟:[{}]", url, jsonParam);
+            } else {
+                Map<String, String[]> parameterMap = request.getParameterMap();
+                if (MapUtil.isNotEmpty(parameterMap)) {
+                    String parameters = JsonUtils.toJsonString(parameterMap);
+                    log.info("[PLUS]寮�濮嬭姹� => URL[{}],鍙傛暟绫诲瀷[param],鍙傛暟:[{}]", url, parameters);
+                } else {
+                    log.info("[PLUS]寮�濮嬭姹� => URL[{}],鏃犲弬鏁�", url);
+                }
+            }
+
+            StopWatch stopWatch = new StopWatch();
+            invokeTimeTL.set(stopWatch);
+            stopWatch.start();
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletionByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        if (TLogContext.enableInvokeTimePrint()) {
+            StopWatch stopWatch = invokeTimeTL.get();
+            stopWatch.stop();
+            log.info("[PLUS]缁撴潫璇锋眰 => URL[{}],鑰楁椂:[{}]姣", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
+            invokeTimeTL.remove();
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏈璇锋眰鐨勬暟鎹被鍨嬫槸鍚︿负json
+     *
+     * @param request request
+     * @return boolean
+     */
+    private boolean isJsonRequest(HttpServletRequest request) {
+        String contentType = request.getContentType();
+        if (contentType != null) {
+            return StringUtils.startsWithIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE);
+        }
+        return false;
+    }
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index b1ecf81..f4e2b5f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -1,10 +1,13 @@
 package com.ruoyi.framework.config;
 
+import com.ruoyi.framework.Interceptor.PlusWebInvokeTimeInterceptor;
+import com.yomahub.tlog.web.interceptor.TLogWebInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -20,6 +23,14 @@
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
     }
 
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 鍏ㄥ眬閾捐矾璺熻釜鎷︽埅鍣�
+        registry.addInterceptor(new TLogWebInterceptor());
+        // 鍏ㄥ眬璁块棶鎬ц兘鎷︽埅
+        registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
+    }
+
     /**
      * 璺ㄥ煙閰嶇疆
      */
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java
new file mode 100644
index 0000000..68bc425
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java
@@ -0,0 +1,49 @@
+package com.ruoyi.framework.config;
+
+import com.yomahub.tlog.core.aop.AspectLogAop;
+import com.yomahub.tlog.feign.filter.TLogFeignFilter;
+import com.yomahub.tlog.spring.TLogPropertyInit;
+import com.yomahub.tlog.spring.TLogSpringAware;
+import com.yomahub.tlog.springboot.property.TLogProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.core.annotation.Order;
+
+/**
+ * 鏁村悎 TLog 妗嗘灦閰嶇疆
+ *
+ * @author Lion Li
+ * @since 3.3.0
+ */
+@Order(-999)
+@Configuration
+@Import(TLogProperty.class)
+public class TLogConfig {
+
+    @Bean
+    public TLogPropertyInit tLogPropertyInit(TLogProperty tLogProperty) {
+        TLogPropertyInit tLogPropertyInit = new TLogPropertyInit();
+        tLogPropertyInit.setPattern(tLogProperty.getPattern());
+        tLogPropertyInit.setEnableInvokeTimePrint(tLogProperty.enableInvokeTimePrint());
+        tLogPropertyInit.setIdGenerator(tLogProperty.getIdGenerator());
+        tLogPropertyInit.setMdcEnable(tLogProperty.getMdcEnable());
+        return tLogPropertyInit;
+    }
+
+    @Bean
+    public TLogSpringAware tLogSpringAware(){
+        return new TLogSpringAware();
+    }
+
+    @Bean
+    public AspectLogAop aspectLogAop() {
+        return new AspectLogAop();
+    }
+
+    @Bean
+    public TLogFeignFilter tLogFeignFilter() {
+        return new TLogFeignFilter();
+    }
+
+}

--
Gitblit v1.9.3