Browse Source

add logback to tio-boot (#9690)

* change to for each

* add logback

---------

Co-authored-by: litongjava <[email protected]>
Tong Li 5 months ago
parent
commit
1b5925e0df

+ 6 - 1
frameworks/Java/tio-boot/pom.xml

@@ -27,8 +27,14 @@
       <groupId>com.litongjava</groupId>
       <artifactId>java-db</artifactId>
       <version>1.5.0</version>
+    </dependency>
 
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>1.2.3</version>
     </dependency>
+
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -36,7 +42,6 @@
       <scope>test</scope>
     </dependency>
 
-
     <dependency>
       <groupId>com.alibaba.fastjson2</groupId>
       <artifactId>fastjson2</artifactId>

+ 20 - 19
frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/MainAppConfig.java

@@ -15,24 +15,6 @@ public class MainAppConfig implements BootConfiguration {
 
   @Override
   public void config() throws Exception {
-    // add route
-    IndexHandler controller = new IndexHandler();
-
-    TioBootServer server = TioBootServer.me();
-    HttpRequestRouter requestRouter = server.getRequestRouter();
-
-    requestRouter.add("/", controller::index);
-    requestRouter.add("/plaintext", controller::plaintext);
-    requestRouter.add("/json", controller::json);
-
-    DbHandler dbQueryController = new DbHandler();
-    requestRouter.add("/db", dbQueryController::db);
-    requestRouter.add("/queries", dbQueryController::queries);
-    requestRouter.add("/updates", dbQueryController::updates);
-    requestRouter.add("/fortunes", dbQueryController::fortunes);
-
-    CacheHandler cacheController = new CacheHandler();
-    requestRouter.add("/cachedQuery", cacheController::cachedQuery);
 
     boolean db = EnvUtils.getBoolean("db", true);
     if (db) {
@@ -49,6 +31,25 @@ public class MainAppConfig implements BootConfiguration {
     } catch (Exception e) {
       e.printStackTrace();
     }
-  }
 
+    // add route
+    IndexHandler controller = new IndexHandler();
+
+    TioBootServer server = TioBootServer.me();
+    HttpRequestRouter requestRouter = server.getRequestRouter();
+    if (requestRouter != null) {
+      requestRouter.add("/", controller::index);
+      requestRouter.add("/plaintext", controller::plaintext);
+      requestRouter.add("/json", controller::json);
+
+      DbHandler dbQueryController = new DbHandler();
+      requestRouter.add("/db", dbQueryController::db);
+      requestRouter.add("/queries", dbQueryController::queries);
+      requestRouter.add("/updates", dbQueryController::updates);
+      requestRouter.add("/fortunes", dbQueryController::fortunes);
+
+      CacheHandler cacheController = new CacheHandler();
+      requestRouter.add("/cachedQuery", cacheController::cachedQuery);
+    }
+  }
 }

+ 18 - 18
frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/CacheHandler.java

@@ -1,13 +1,13 @@
 package com.litongjava.tio.http.server.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 
 import com.alibaba.fastjson2.JSON;
 import com.litongjava.db.activerecord.Db;
 import com.litongjava.db.activerecord.Row;
+import com.litongjava.tio.boot.http.TioRequestContext;
 import com.litongjava.tio.http.common.HeaderName;
 import com.litongjava.tio.http.common.HeaderValue;
 import com.litongjava.tio.http.common.HttpRequest;
@@ -16,26 +16,26 @@ import com.litongjava.tio.http.server.utils.RandomUtils;
 
 public class CacheHandler {
   // private Logger log = LoggerFactory.getLogger(this.getClass());
+  String sql = "SELECT id, randomNumber FROM world WHERE id = ?";
 
   public HttpResponse cachedQuery(HttpRequest request) {
     String queries = request.getParam("queries");
-    List<Map<String, Object>> recordMaps = RandomUtils.randomWorldNumbers()
-        // limit
-        .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量
-        .mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象
-        .filter(Objects::nonNull) // 过滤掉 null 值
-        .map(Row::toMap) // 将每个 Record 对象转换为 Map
-        .collect(Collectors.toList()); // 收集到 List
-
-    HttpResponse httpResponse = new HttpResponse(request);
-    httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
-    httpResponse.setBody(JSON.toJSONBytes(recordMaps));
-    return httpResponse;
 
-  }
+    int queryCount = RandomUtils.parseQueryCount(queries);
+
+    List<Map<String, Object>> recordMaps = new ArrayList<>();
+
+    int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();
+    for (int id : randomNumbers) {
+      Row row = Db.findFirstByCache("world", id, sql, id);
+      if (row != null) {
+        recordMaps.add(row.toMap());
+      }
+    }
 
-  private Row findByIdWithCache(String tableName, int id) {
-    String sql = "SELECT id, randomNumber FROM world WHERE id = ?";
-    return Db.findFirstByCache(tableName, id, sql, id);
+    HttpResponse response = TioRequestContext.getResponse();
+    response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
+    response.setBody(JSON.toJSONBytes(recordMaps));
+    return response;
   }
 }

+ 39 - 38
frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/DbHandler.java

@@ -5,8 +5,6 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 
 import com.alibaba.fastjson2.JSON;
 import com.jfinal.template.Engine;
@@ -14,6 +12,7 @@ import com.jfinal.template.Template;
 import com.litongjava.db.activerecord.Db;
 import com.litongjava.db.activerecord.Row;
 import com.litongjava.ehcache.EhCacheKit;
+import com.litongjava.tio.boot.http.TioRequestContext;
 import com.litongjava.tio.http.common.HeaderName;
 import com.litongjava.tio.http.common.HeaderValue;
 import com.litongjava.tio.http.common.HttpRequest;
@@ -23,6 +22,10 @@ import com.litongjava.tio.http.server.util.Resps;
 import com.litongjava.tio.http.server.utils.RandomUtils;
 
 public class DbHandler {
+  private Engine engine = Engine.use();
+  private String filename = "fortunes.html";
+  private Template template = engine.getTemplate(filename);
+  private static final byte[] bytes = "{}".getBytes();
 
   public HttpResponse db(HttpRequest request) {
     Integer id = request.getInt("id");
@@ -31,7 +34,7 @@ public class DbHandler {
     }
 
     //System.out.println("id:" + id);
-    HttpResponse httpResponse = new HttpResponse(request);
+    HttpResponse httpResponse = TioRequestContext.getResponse();
 
     // int id = 11;
     // String sql="SELECT id, randomNumber FROM world WHERE id = ?";
@@ -40,7 +43,7 @@ public class DbHandler {
     if (recored != null) {
       httpResponse.setBody(JSON.toJSONBytes(recored.toMap()));
     } else {
-      httpResponse.setBody("{}".getBytes());
+      httpResponse.setBody(bytes);
     }
 
     httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
@@ -51,15 +54,19 @@ public class DbHandler {
   // @GetMapping("/queries")
   public HttpResponse queries(HttpRequest request) {
     String queries = request.getParam("queries");
-    List<Map<String, Object>> recordMaps = RandomUtils.randomWorldNumbers()
-        // limit
-        .limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量
-        .mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象
-        .filter(Objects::nonNull) // 过滤掉 null 值
-        .map(Row::toMap) // 将每个 Record 对象转换为 Map
-        .collect(Collectors.toList()); // 收集到 List
+    int queryCount = RandomUtils.parseQueryCount(queries);
+    int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();
 
-    HttpResponse httpResponse = new HttpResponse(request);
+    List<Map<String, Object>> recordMaps = new ArrayList<>();
+
+    for (int id : randomNumbers) {
+      Row row = Db.findById("world", id);
+      if (row != null) {
+        recordMaps.add(row.toMap());
+      }
+    }
+
+    HttpResponse httpResponse = TioRequestContext.getResponse();
     httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
     httpResponse.setBody(JSON.toJSONBytes(recordMaps));
     return httpResponse;
@@ -71,27 +78,24 @@ public class DbHandler {
 
     EhCacheKit.removeAll("world");
 
-    List<Map<String, Object>> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers
-        // limit
-        .limit(RandomUtils.parseQueryCount(queries))
-        // map
-        .mapToObj(id -> Db.findById("world", id))
-        // not null
-        .filter(Objects::nonNull).map(record -> {
-          int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber"
-          int newRandomNumber;
-          do {
-            newRandomNumber = RandomUtils.randomWorldNumber();
-          } while (newRandomNumber == currentRandomNumber);
-
-          record.set("randomnumber", newRandomNumber);
-          Db.update("world", "id", record); // update
-          return record;
-        })
-        // tomap
-        .map(Row::toMap)
-        // to List
-        .collect(Collectors.toList());
+    int queryCount = RandomUtils.parseQueryCount(queries);
+    int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();
+    List<Map<String, Object>> updatedRecords = new ArrayList<>();
+
+    for (int id : randomNumbers) {
+      Row row = Db.findById("world", id);
+      if (row != null) {
+        int currentRandomNumber = row.getInt("randomNumber"); // "randomnumber"
+        int newRandomNumber;
+        do {
+          newRandomNumber = RandomUtils.randomWorldNumber();
+        } while (newRandomNumber == currentRandomNumber);
+
+        row.set("randomnumber", newRandomNumber);
+        Db.update("world", "id", row); // update
+        updatedRecords.add(row.toMap());
+      }
+    }
 
     HttpResponse httpResponse = new HttpResponse(request);
     httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
@@ -116,11 +120,8 @@ public class DbHandler {
     viewData.put("fortunes", fortunes);
 
     // 转换为 HTML
-    Engine engine = Engine.use();
-    String filename = "fortunes.html";
-    Template template = engine.getTemplate(filename);
     String html = template.renderToString(viewData);
-
-    return Resps.html(request, html);
+    HttpResponse httpResponse = TioRequestContext.getResponse();
+    return Resps.html(httpResponse, html);
   }
 }

+ 10 - 12
frameworks/Java/tio-boot/src/main/java/com/litongjava/tio/http/server/controller/IndexHandler.java

@@ -1,6 +1,7 @@
 package com.litongjava.tio.http.server.controller;
 
 import com.alibaba.fastjson2.JSON;
+import com.litongjava.tio.boot.http.TioRequestContext;
 import com.litongjava.tio.http.common.HeaderName;
 import com.litongjava.tio.http.common.HeaderValue;
 import com.litongjava.tio.http.common.HttpRequest;
@@ -22,19 +23,16 @@ public class IndexHandler {
   }
 
   public HttpResponse plaintext(HttpRequest request) {
-    // 更高性能的写法
-    HttpResponse ret = new HttpResponse(request);
-    ret.setBody(HELLO_WORLD_BYTES);
-    ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT);
-    return ret;
+    HttpResponse response = TioRequestContext.getResponse();
+    response.setBody(HELLO_WORLD_BYTES);
+    response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT);
+    return response;
   }
 
-  // 在IndexController中添加
   public HttpResponse json(HttpRequest request) {
-    // 更高性能的写法
-    HttpResponse ret = new HttpResponse(request);
-    ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes());
-    ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
-    return ret;
+    HttpResponse response = TioRequestContext.getResponse();
+    response.setBody(JSON.toJSONBytes(new Message(HELLO_WORLD)));
+    response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
+    return response;
   }
-}
+}

+ 22 - 19
frameworks/Java/tio-boot/src/main/resources/logback.xml

@@ -1,9 +1,13 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<configuration>
-  <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
+<configuration debug="false" xmlns="http://ch.qos.logback/xml/ns/logback" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd
+http://ch.qos.logback/xml/ns/logback ">
+
+  <!-- 定义日志文件的存储地址,避免在 Logback 的配置中使用相对路径 -->
   <property name="LOG_HOME" value="logs" />
-  <!--格式化输出:%d表示日期,%-6level:日志级别从左显示6个字符宽度,%m:日志消息,%n是换行符 -->
-  <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level%logger{0}.%M:%L - %m%n" />
+
+  <!-- 格式化输出:%d 表示日期,[%thread] 输出线程名称,%-6level 表示日志级别占6个字符宽度,%logger{1}.%M:%L 表示类名、方法名和行号,%m 表示日志消息,%n 是换行符 -->
+  <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level %logger{1}.%M:%L - %m%n" />
 
   <!-- 控制台输出 -->
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
@@ -12,41 +16,40 @@
     </encoder>
   </appender>
 
-  <!-- 按照每生成日志文件 -->
+  <!-- 按照每小时生成日志文件 -->
   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
       <pattern>${CONSOLE_LOG_PATTERN}</pattern>
     </encoder>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-      <!--日志文件输出的文件名 -->
-      <fileNamePattern>${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log</fileNamePattern>
-      <!--日志文件保留天数 -->
+    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+      <!-- 日志文件输出的文件名,包含日期和小时 -->
+      <fileNamePattern>${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log</fileNamePattern>
+      <!-- 日志文件保留天数 -->
       <maxHistory>180</maxHistory>
+      <!-- 每个日志文件的最大大小 -->
+      <maxFileSize>100MB</maxFileSize>
     </rollingPolicy>
-    <!--日志文件最大的大小 -->
-    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>10MB</maxFileSize>
-    </triggeringPolicy>
   </appender>
-  
-  <!--专为 spring 定制 -->
+
+  <!-- Spring 框架日志级别设置 -->
   <logger name="org.springframework" level="info" />
-  <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
+
+  <!-- Hibernate 日志级别设置,显示 SQL 语句和绑定参数 -->
   <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
   <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
   <logger name="org.hibernate.SQL" level="DEBUG" />
   <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
   <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
 
-  <!--myibatis log configure -->
+  <!-- MyBatis 和 SQL 相关日志配置 -->
   <logger name="com.apache.ibatis" level="TRACE" />
   <logger name="java.sql.Connection" level="DEBUG" />
   <logger name="java.sql.Statement" level="DEBUG" />
   <logger name="java.sql.PreparedStatement" level="DEBUG" />
 
-  <!-- 日志输出级别 和输出源 -->
+  <!-- 根日志记录器的日志级别和输出目标 -->
   <root level="info">
     <appender-ref ref="STDOUT" />
     <appender-ref ref="FILE" />
   </root>
-</configuration>
+</configuration>

+ 1 - 2
frameworks/Java/tio-boot/src/test/java/com/litongjava/tio/http/server/MainAppTest.java

@@ -6,10 +6,9 @@ import com.litongjava.tio.utils.environment.EnvUtils;
 
 public class MainAppTest {
 
-  @Test
+  // @Test
   public void test() {
     boolean boolean1 = EnvUtils.getBoolean("native", false);
     System.out.println(boolean1);
   }
-
 }