Bläddra i källkod

微调日志模块

reghao 4 år sedan
förälder
incheckning
8385d85caf

+ 16 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysLogPageController.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.sys.controller;
 
+import cn.reghao.autodop.dmaster.sys.db.MongoQuery;
 import cn.reghao.autodop.dmaster.sys.entity.AppRuntimeLog;
 import cn.reghao.autodop.dmaster.sys.repository.AppRuntimeLogRepository;
 import cn.reghao.autodop.dmaster.utils.db.PageList;
@@ -21,22 +22,32 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/sys/log")
 @Controller
 public class SysLogPageController {
+    private MongoQuery mongoQuery;
     private AppRuntimeLogRepository runtimeLogRepository;
 
-    public SysLogPageController(AppRuntimeLogRepository runtimeLogRepository) {
+    public SysLogPageController(MongoQuery mongoQuery, AppRuntimeLogRepository runtimeLogRepository) {
+        this.mongoQuery = mongoQuery;
         this.runtimeLogRepository = runtimeLogRepository;
     }
 
     @ApiOperation(value = "运行日志页面")
-    @GetMapping("/running")
-    public String runningLogPage(Model model) {
+    @GetMapping("/runtime")
+    public String runtimeLogPage(Model model) {
+        mongoQuery.aggregate("AppRuntimeLog");
+
         PageRequest pageRequest = PageSort.pageRequest("createTime", Sort.Direction.DESC);
         Page<AppRuntimeLog> page = runtimeLogRepository.findAll(pageRequest);
         PageList<AppRuntimeLog> pageList = PageList.pageList(page);
 
         model.addAttribute("page", page);
         model.addAttribute("list", pageList.getList());
-        return "/sys/log/running";
+        return "/sys/log/runtime";
+    }
+
+    @ApiOperation(value = "运行日志详情页面")
+    @GetMapping("/runtime/detail/{id}")
+    public String runtimeLogDeatilPage(@PathVariable("id") String id, Model model) {
+        return "/sys/log/rtdetail";
     }
 
     @ApiOperation(value = "访问日志页面")
@@ -48,6 +59,6 @@ public class SysLogPageController {
 
         model.addAttribute("page", page);
         model.addAttribute("list", pageList.getList());
-        return "/sys/log/running";
+        return "/sys/log/access";
     }
 }

+ 59 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/db/MongoQuery.java

@@ -0,0 +1,59 @@
+package cn.reghao.autodop.dmaster.sys.db;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.client.AggregateIterable;
+import org.bson.Document;
+import org.bson.types.ObjectId;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-06-17 15:12:02
+ */
+@Component
+public class MongoQuery {
+    private MongoTemplate mongoTemplate;
+
+    public MongoQuery(MongoTemplate mongoTemplate) {
+        this.mongoTemplate = mongoTemplate;
+    }
+
+    public void aggregate(String col) {
+        String groupById = "$answerId";
+        Document groupObject = new Document("_id", groupById);
+        groupObject.put("total", new BasicDBObject("$sum", 1));
+        groupObject.put("data", new BasicDBObject("$push", "$$ROOT"));
+        Document queryGroup = new Document("$group", groupObject);
+
+        Document sortObject = new Document("$sort", new BasicDBObject("total", -1));
+        Document limitObject = new Document("$limit", 10000);
+
+        List<Document> pipeline = new ArrayList<>();
+        pipeline.add(queryGroup);
+        pipeline.add(sortObject);
+        pipeline.add(limitObject);
+
+        AggregateIterable<Document> result = mongoTemplate.getCollection(col).aggregate(pipeline).allowDiskUse(true);
+        for (Document document : result) {
+            List<Document> list = document.getList("data", Document.class);
+            int size = list.size();
+            // 删除重复的数据
+            if (size > 1) {
+                for (int i = 1; i < size; i++) {
+                    Document doc = list.get(i);
+                    ObjectId objectId = doc.get("_id", ObjectId.class);
+
+                    Query query = new Query();
+                    query.addCriteria(Criteria.where("_id").is(objectId));
+                    //mongoTemplate.remove(query, col);
+                }
+            }
+        }
+    }
+}

+ 11 - 11
dmaster/src/main/resources/templates/sys/log/dagent.html → dmaster/src/main/resources/templates/sys/log/access.html

@@ -5,7 +5,7 @@
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
-        <span><i class="fa fa-bars"></i> dagent 日志</span>
+        <span><i class="fa fa-bars"></i> 访问日志</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
     </div>
     <div class="layui-card-body">
@@ -13,20 +13,20 @@
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
-                    <th class="sortable" data-field="logTime">时间</th>
-                    <th class="sortable" data-field="level">级别</th>
-                    <th class="sortable" data-field="threadName">线程名</th>
-                    <th class="sortable" data-field="loggerName">logger 名</th>
-                    <th class="sortable" data-field="message">内容</th>
+                    <th class="sortable" data-field="machineIpv4">机器地址</th>
+                    <th class="sortable" data-field="appId">应用</th>
+                    <th>查看</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td th:text="${item.logTime}">时间</td>
-                    <td th:text="${item.level}">级别</td>
-                    <td th:text="${item.threadName}">线程名</td>
-                    <td th:text="${item.loggerName}">logger 名</td>
-                    <td th:text="${item.message}">内容</td>
+                    <td th:text="${item.machineIpv4}">机器地址</td>
+                    <td th:text="${item.appId}">应用</td>
+                    <td>
+                        <a class="open-popup" data-title="日志"
+                           th:attr="data-url=@{'/sys/log/detail/'+${item.id}}" data-size="640,480"
+                           href="#">查看</a>
+                    </td>
                 </tr>
                 </tbody>
             </table>

+ 21 - 0
dmaster/src/main/resources/templates/sys/log/rtdetail.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 运行日志详情</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+    <div class="layui-card-body">
+        <div class="timo-table-wrap">
+        </div>
+    </div>
+</div>
+
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+</script>
+</body>
+</html>

+ 6 - 10
dmaster/src/main/resources/templates/sys/log/running.html → dmaster/src/main/resources/templates/sys/log/runtime.html

@@ -15,22 +15,18 @@
                 <tr>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
                     <th class="sortable" data-field="appId">应用</th>
-                    <th class="sortable" data-field="logTime">时间</th>
-                    <th class="sortable" data-field="level">级别</th>
-                    <th class="sortable" data-field="threadName">线程名</th>
-                    <th class="sortable" data-field="loggerName">logger 名</th>
-                    <th class="sortable" data-field="message">内容</th>
+                    <th>查看</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
                     <td th:text="${item.machineIpv4}">机器地址</td>
                     <td th:text="${item.appId}">应用</td>
-                    <td th:text="${item.logTime}">时间</td>
-                    <td th:text="${item.level}">级别</td>
-                    <td th:text="${item.threadName}">线程名</td>
-                    <td th:text="${item.loggerName}">logger 名</td>
-                    <td th:text="${item.message}">日志内容</td>
+                    <td>
+                        <a class="open-popup" data-title="日志"
+                           th:attr="data-url=@{'/sys/log/runtime/detail/'+${item.id}}" data-size="640,480"
+                           href="#">查看</a>
+                    </td>
                 </tr>
                 </tbody>
             </table>