文件夹挂载逻辑变动2

This commit is contained in:
2026-07-30 00:20:11 +08:00
parent defc9d00d3
commit 62e48a25d9
+1 -87
View File
@@ -4,13 +4,10 @@ import (
"bytes" "bytes"
"embed" "embed"
"fmt" "fmt"
"io"
"io/fs" "io/fs"
"net" "net"
"net/http" "net/http"
"os"
"strconv" "strconv"
"strings"
"text/template" "text/template"
"time" "time"
@@ -399,7 +396,7 @@ func getFrpcStatusHandler(c *gin.Context) {
// ========== 日志 Handler ========== // ========== 日志 Handler ==========
func getFrpcLogHandler(c *gin.Context) { func getFrpcLogHandler(c *gin.Context) {
// ./data/frpc.log 读取日志 // readTailLog 在 frp.go 中定义,读取 ./data/frpc.log
lines, err := readTailLog("./data/frpc.log", 200) lines, err := readTailLog("./data/frpc.log", 200)
if err != nil { if err != nil {
c.JSON(http.StatusOK, gin.H{ 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 ========== // ========== Ping Handler ==========
func pingHandler(c *gin.Context) { func pingHandler(c *gin.Context) {
@@ -620,7 +535,6 @@ func ExportTomlHandler(c *gin.Context) {
} }
} }
// 构建与 GenerateFrpcConfig 一致的数据结构
data := struct { data := struct {
*GlobalConfig *GlobalConfig
Proxies []Proxy Proxies []Proxy