fix: logs error coding

This commit is contained in:
duorameng
2026-04-29 09:06:05 +08:00
parent 32e04d5ea2
commit a1899298d5
2 changed files with 138 additions and 16 deletions
+34 -16
View File
@@ -9,12 +9,18 @@ import (
"os"
"path/filepath"
"sync"
"unicode/utf8"
"github.com/engigu/baihu-panel/internal/constant"
"github.com/engigu/baihu-panel/internal/logger"
"github.com/engigu/baihu-panel/internal/utils"
)
const (
// maxLogBufferLen 定义了没有换行符时的最大缓冲长度 (4KB)
maxLogBufferLen = 4096
)
var (
// globalTinyLogManager 跟踪所有活跃的 TinyLog 实例
globalTinyLogManager = &TinyLogManager{
@@ -98,12 +104,30 @@ func (l *TinyLog) Write(p []byte) (n int, err error) {
l.remainder = nil
}
// 1. 寻找最后一个换行符
lastNewline := bytes.LastIndexByte(payload, '\n')
if lastNewline == -1 {
// 没有换行符,且如果长度超过 4KB,强制截断并输出,防止内存无限制增长
if len(payload) > 4096 {
lastNewline = len(payload) - 1
// 1. 寻找最后一个换行符 (\n 或 \r)
lastLineBreak := bytes.LastIndexAny(payload, "\n\r")
var completeBytes []byte
var remainder []byte
if lastLineBreak != -1 {
// 2. 提取出完整的行
completeBytes = payload[:lastLineBreak+1]
remainder = payload[lastLineBreak+1:]
} else {
// 3. 没有换行符,且如果长度超过最大缓冲,强制截断并输出,防止内存无限制增长
if len(payload) > maxLogBufferLen {
// 寻找最后一个完整的 UTF-8 字符边界,避免乱码
lastSafe := maxLogBufferLen
for i := maxLogBufferLen; i > 0 && i > maxLogBufferLen-4; i-- {
if utf8.RuneStart(payload[i-1]) {
if !utf8.FullRune(payload[i-1 : maxLogBufferLen]) {
lastSafe = i - 1
}
break
}
}
completeBytes = payload[:lastSafe]
remainder = payload[lastSafe:]
} else {
// 保留当前所有内容到下一轮
l.remainder = payload
@@ -111,20 +135,14 @@ func (l *TinyLog) Write(p []byte) (n int, err error) {
}
}
// 2. 提取出完整的行
completeBytes := payload[:lastNewline+1]
// 4. 将剩余部分保存
l.remainder = remainder
// 3. 剥离并保存剩余的部分
if lastNewline+1 < len(payload) {
l.remainder = make([]byte, len(payload)-(lastNewline+1))
copy(l.remainder, payload[lastNewline+1:])
}
// 4. 将完整行转换为 UTF-8 并脱敏
// 5. 将完整行转换为 UTF-8 并脱敏
text := utils.MaskSecrets(utils.ToUTF8(completeBytes), l.masks)
outData := []byte(text)
// 5. 输出安全部分
// 6. 输出安全部分
_, err = l.writer.Write(outData)
if err != nil {
return 0, err