Forráskód Böngészése

使用 xterm.js 实现 app 运行日志实时查看

reghao 2 éve
szülő
commit
baa3c01d7e

+ 8 - 0
manager/src/main/java/cn/reghao/devops/manager/app/controller/page/StatusPageController.java

@@ -92,6 +92,14 @@ public class StatusPageController {
         return "/app/stat/index2";
     }
 
+    @ApiOperation(value = "应用运行日志页面")
+    @GetMapping(value = "/log/{appId}")
+    public String appLog(@PathVariable(value = "appId") String appId, Model model) {
+        /*List<AppRunning> list = deployStat.getAppRunning(appId);
+        model.addAttribute("list", list);*/
+        return "/app/stat/applog";
+    }
+
     @ApiOperation(value = "应用运行日志页面")
     @GetMapping(value = "/log")
     public String appLogPage(@RequestParam(value = "app", required = false) String app,

+ 1 - 1
manager/src/main/java/cn/reghao/devops/manager/event/ws/handler/LogHandler.java

@@ -70,7 +70,7 @@ public class LogHandler implements WebSocketHandler {
                 Object object = JdkSerializer.deserialize(binaryMessage.getPayload().array());
                 if (object instanceof AppLog) {
                     AppLog appLog = (AppLog) object;
-                    logService.saveAppLog(appLog);
+                    //logService.saveAppLog(appLog);
                     if (pullSession != null) {
                         String jsonData = JsonConverter.objectToJson(appLog);
                         WebSocketMessage<String> message1 = new TextMessage(jsonData);

+ 1 - 1
manager/src/main/resources/static/js/websocket.js

@@ -22,7 +22,7 @@ WebSocketClient.prototype._generateEndpoint = function () {
     }
 
     var url = 'wss://devops.reghao.cn/ws/log/pull?token=12345678'
-    url = 'wss://devops.reghao.cn/ws/ssh?token=12345678'
+    //url = 'wss://devops.reghao.cn/ws/ssh?token=12345678'
     return  url;
 };
 

+ 81 - 0
manager/src/main/resources/templates/app/stat/applog.html

@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+    <link rel="stylesheet" th:href="@{/css/xterm.css}"/>
+</head>
+
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="pull-left layui-form-pane">
+                <div class="layui-inline">
+                    <label class="layui-form-label">环境</label>
+                    <div class="layui-input-block timo-search-status">
+                        <select id="getPageByEnv" class="timo-search-select" name="env" onchange="getPageByEnv()"
+                                mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div id="terminal" class="timo-table-wrap">
+        </div>
+    </div>
+</div>
+</body>
+
+<script type="text/javascript" th:src="@{/js/plugins/jquery-3.4.1.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/websocket.js}"></script>
+<script type="text/javascript" th:src="@{/js/xterm.js}"></script>
+<script type="text/javascript" th:inline="javascript">
+    function getPageByEnv() {
+        console.log('切换机器')
+    }
+
+    openTerminal();
+    function openTerminal(){
+        var client = new WebSocketClient();
+        var term = new Terminal({
+            cols: 80,
+            rows: 30,
+            cursorBlink: true, // 光标闪烁
+            cursorStyle: "block", // 光标样式  null | 'block' | 'underline' | 'bar'
+            scrollback: 100, //回滚
+            tabStopWidth: 8, //制表宽度
+            screenKeys: true
+        });
+
+        term.on('data', function (data) {
+            // 键盘输入时的回调函数
+            client.sendClientData(data);
+        });
+        term.open(document.getElementById('terminal'));
+        //在页面上显示连接中...
+        term.write('Connecting...');
+        //执行连接操作
+        client.connect({
+            onError: function (error) {
+                // 连接失败回调
+                console.log('WebSocket 连接错误...')
+                term.write('Error: ' + error + '\r\n');
+            },
+            onConnect: function () {
+                // 连接成功回调
+                console.log('WebSocket 连接成功...')
+            },
+            onClose: function () {
+                // 连接关闭回调
+                console.log('WebSocket 连接关闭...')
+                term.write("\rconnection closed");
+            },
+            onData: function (data) {
+                // 收到数据时回调
+                console.log('接收到 WebSocket 的数据...')
+                term.write(data);
+            }
+        });
+    }
+</script>
+</html>

+ 9 - 2
manager/src/main/resources/templates/app/stat/index1.html

@@ -4,6 +4,7 @@
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
     <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
 </head>
+
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
@@ -60,8 +61,14 @@
                     <td th:text="${item.bindPorts}">监听端口</td>
                     <td th:text="${item.totalDeployed}">已部署数量</td>
                     <td>
-                        <a class="open-popup" th:attr="data-title=${item.appName} + ' - 运行状态',
-                        data-url=@{'/app/stat/detail/'+${item.appId}}" data-size="1200,500" href="#">查看</a>
+                        <a class="open-popup"
+                           th:attr="data-title=${item.appName} + ' - 运行状态', data-url=@{'/app/stat/detail/'+${item.appId}}"
+                           data-size="1200,500" href="#">查看
+                        </a>
+                        <a class="open-popup"
+                           th:attr="data-title=${item.appName} + ' - 运行日志', data-url=@{'/app/stat/log/'+${item.appId}}"
+                           data-size="1280,720" href="#">日志
+                        </a>
                     </td>
                 </tr>
                 </tbody>