wechat-robot/internal/handler/api_container.go
2025-04-02 14:29:57 +08:00

93 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}