diff --git a/api.go b/api.go index 665d1bd..9ba667c 100644 --- a/api.go +++ b/api.go @@ -4,13 +4,10 @@ import ( "bytes" "embed" "fmt" - "io" "io/fs" "net" "net/http" - "os" "strconv" - "strings" "text/template" "time" @@ -399,7 +396,7 @@ func getFrpcStatusHandler(c *gin.Context) { // ========== 日志 Handler ========== func getFrpcLogHandler(c *gin.Context) { - // 从 ./data/frpc.log 读取日志 + // readTailLog 在 frp.go 中定义,读取 ./data/frpc.log lines, err := readTailLog("./data/frpc.log", 200) if err != nil { c.JSON(http.StatusOK, gin.H{ @@ -421,88 +418,6 @@ func getFrpcLogHandler(c *gin.Context) { }) } -// readTailLog 读取文件末尾 n 行(倒序读取,返回正序) -func readTailLog(filePath string, n int) ([]string, error) { - file, err := os.Open(filePath) - if err != nil { - return nil, err - } - defer file.Close() - - // 获取文件大小 - info, err := file.Stat() - if err != nil { - return nil, err - } - fileSize := info.Size() - if fileSize == 0 { - return []string{}, nil - } - - // 从末尾开始读 - const chunkSize = 4096 - var lines []string - var leftover []byte - offset := fileSize - - for len(lines) < n && offset > 0 { - // 计算读取起点 - readSize := chunkSize - if offset < int64(chunkSize) { - readSize = int(offset) - } - offset -= int64(readSize) - - // 读取这一块 - buf := make([]byte, readSize) - _, err := file.ReadAt(buf, offset) - if err != nil && err != io.EOF { - return nil, err - } - - // 将当前块与之前剩下的拼接 - data := append(buf, leftover...) - leftover = nil - - // 按行分割(从后往前) - start := 0 - for i := len(data) - 1; i >= 0; i-- { - if data[i] == '\n' { - if i+1 < len(data) { - line := string(data[i+1:]) - if line != "" { - lines = append([]string{line}, lines...) - if len(lines) >= n { - break - } - } - } - start = i - } - } - - // 如果还没凑够,把未处理的部分留到下一轮 - if len(lines) < n && start > 0 { - leftover = data[:start] - } - } - - // 处理最后剩余部分(文件开头) - if len(lines) < n && len(leftover) > 0 { - parts := strings.Split(string(leftover), "\n") - for i := len(parts) - 1; i >= 0; i-- { - if parts[i] != "" { - lines = append([]string{parts[i]}, lines...) - if len(lines) >= n { - break - } - } - } - } - - return lines, nil -} - // ========== Ping Handler ========== func pingHandler(c *gin.Context) { @@ -620,7 +535,6 @@ func ExportTomlHandler(c *gin.Context) { } } - // 构建与 GenerateFrpcConfig 一致的数据结构 data := struct { *GlobalConfig Proxies []Proxy