Smail/backend/services/runtimelog/presentation.go
smail c4e9a2fa61
Some checks are pending
Security Checks / security (push) Waiting to run
保留日志横幅中的结构化证据并记录浏览器验收
2026-09-09 01:20:23 +08:00

48 lines
1.5 KiB
Go

package runtimelog
import (
"regexp"
"strings"
"git.pcux.cn/xuans/Smail/utils/logpolicy"
)
var contentLine = regexp.MustCompile(`^\[[^\]\r\n]+\]\s+\[(info|debug|trace)\]\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\](?:\[[^\]\r\n]*\])?\[([^\]\r\n]+):\d+\]([^\r\n]*)$`)
// presentLine 先过滤明确无内容的历史记录;警告、错误和未知格式均保留原文。
func presentLine(line string) (string, bool) {
parts := contentLine.FindStringSubmatch(line)
if parts == nil {
if end := strings.Index(line, "] "); end >= 0 && logpolicy.EmptyMessage(line[end+2:]) {
return "", false
}
return line, true
}
if logpolicy.EmptyMessage(parts[3]) || (parts[1] == "info" && legacyStartupNoise(parts[2], parts[3])) {
return "", false
}
return line, true
}
func legacyStartupNoise(source, message string) bool {
source = strings.ReplaceAll(source, `\`, "/")
if source != "internal/app/app.go" && !strings.HasSuffix(source, "/internal/app/app.go") {
return false
}
message = strings.TrimSpace(message)
// 新格式器可能在横幅文案后附带结构化字段;未知附加信息不得按旧横幅丢弃。
if strings.ContainsAny(message, "{}") {
return false
}
if !strings.HasPrefix(message, "***\t") && !strings.HasPrefix(message, "*** ") {
return false
}
message = strings.TrimSpace(message[3:])
for _, prefix := range []string{"Server Version:", "Git Commit Hash:", "Build Date:", "Build GoLang Version:"} {
if strings.HasPrefix(message, prefix) {
return true
}
}
return false
}