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 }