fix(notify): optimize log truncation by rune instead of byte #133
This commit is contained in:
@@ -431,8 +431,9 @@ func (s *NotificationService) handleEvent(bindingType string) eventbus.Handler {
|
||||
if output, ok := payload["output"].(string); ok {
|
||||
// 如果输出包含了压缩后的 Base64 (以 "base64:" 开头),由于是推送到通知,我们尽量不发大段 Base64
|
||||
// 这里简单处理:如果过长则截断,或者如果是压缩的则记录一下
|
||||
if len(output) > 1000 {
|
||||
payload["output"] = output[len(output)-1000:] + "\n...(截断)"
|
||||
trimmed := utils.TrimLastRunes(output, 1000)
|
||||
if len(trimmed) < len(output) {
|
||||
payload["output"] = trimmed + "\n...(截断)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,9 +501,14 @@ func (s *NotificationService) handleEvent(bindingType string) eventbus.Handler {
|
||||
if output, ok := payload["output"].(string); ok && output != "" {
|
||||
// 仅保留指定字数的日志内容并移除 ANSI 颜色代码
|
||||
logSnippet := stripAnsi(output)
|
||||
if len(logSnippet) > extra.LogLimit {
|
||||
logSnippet = "...\n" + logSnippet[len(logSnippet)-extra.LogLimit:]
|
||||
|
||||
trimmed := utils.TrimLastRunes(logSnippet, extra.LogLimit)
|
||||
if len(trimmed) < len(logSnippet) {
|
||||
logSnippet = "...\n" + trimmed
|
||||
} else {
|
||||
logSnippet = trimmed
|
||||
}
|
||||
|
||||
currentText += "\n\n[执行日志]\n" + logSnippet
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,3 +41,22 @@ func (r *byteReader) Read(p []byte) (n int, err error) {
|
||||
r.pos += n
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// TrimLastRunes 从字符串尾部保留最多 maxRunes 个字符(不仅限于 ASCII,支持中英文混排的真实字符数量)
|
||||
func TrimLastRunes(s string, maxRunes int) string {
|
||||
// 如果字符串的总字节数小于等于 maxRunes,那么它的字符数一定也小于等于 maxRunes
|
||||
if len(s) <= maxRunes {
|
||||
return s
|
||||
}
|
||||
|
||||
count := 0
|
||||
for i := len(s); i > 0; {
|
||||
_, size := utf8.DecodeLastRuneInString(s[:i])
|
||||
i -= size
|
||||
count++
|
||||
if count == maxRunes {
|
||||
return s[i:]
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user