93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package handler
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
|
||
"gitee.ltd/lxh/wechat-robot/internal/docker"
|
||
)
|
||
|
||
// GetContainerLogs 获取容器日志
|
||
func GetContainerLogs(c *fiber.Ctx) error {
|
||
containerID := c.Params("id")
|
||
if containerID == "" {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"success": false,
|
||
"message": "容器ID不能为空",
|
||
})
|
||
}
|
||
|
||
// 获取日志行数
|
||
lines := c.Query("lines", "100")
|
||
|
||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||
defer cancel()
|
||
|
||
// 获取容器日志
|
||
logs, err := docker.GetContainerLogs(ctx, containerID, lines)
|
||
if err != nil {
|
||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||
"success": false,
|
||
"message": "获取容器日志失败: " + err.Error(),
|
||
})
|
||
}
|
||
|
||
// 处理日志输出,移除控制字符
|
||
cleanLogs := cleanDockerLogs(logs)
|
||
|
||
return c.JSON(fiber.Map{
|
||
"success": true,
|
||
"logs": cleanLogs,
|
||
})
|
||
}
|
||
|
||
// GetContainerStats 获取容器状态
|
||
func GetContainerStats(c *fiber.Ctx) error {
|
||
containerID := c.Params("id")
|
||
if containerID == "" {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"success": false,
|
||
"message": "容器ID不能为空",
|
||
})
|
||
}
|
||
|
||
// 创建上下文,添加超时控制
|
||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
defer cancel()
|
||
|
||
// 获取真实的容器统计数据
|
||
stats, err := docker.GetStats(ctx, containerID)
|
||
if err != nil {
|
||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||
"success": false,
|
||
"message": "获取容器统计数据失败: " + err.Error(),
|
||
})
|
||
}
|
||
|
||
return c.JSON(fiber.Map{
|
||
"success": true,
|
||
"stats": stats,
|
||
})
|
||
}
|
||
|
||
// cleanDockerLogs 移除Docker日志中的控制字符
|
||
func cleanDockerLogs(logs string) string {
|
||
// Docker输出日志中可能包含控制字符,需要清理
|
||
result := logs
|
||
|
||
// 移除8字节头部
|
||
lines := strings.Split(result, "\n")
|
||
for i, line := range lines {
|
||
if len(line) > 8 {
|
||
// 跳过每行前8个字节的头部信息
|
||
lines[i] = line[8:]
|
||
}
|
||
}
|
||
result = strings.Join(lines, "\n")
|
||
|
||
return result
|
||
}
|