package utils import ( "go.uber.org/zap" "regexp" "strings" rotatelogs "github.com/lestrrat-go/file-rotatelogs" ) const ( EndTag = "NNNN" Expression = "(?s)ZCZC.*?NNNN" MaxBufferSize = 65536 BufferTrimSize = 32768 ) var buffer string var exp, _ = regexp.Compile(Expression) var RawLog *rotatelogs.RotateLogs var Tcp bool var Pulsar bool func Append(data string) bool { buffer += data + "\n" if len(buffer) > MaxBufferSize { Log.Warn("buffer overflow, truncating", zap.Int("size", len(buffer)), zap.Int("max", MaxBufferSize)) buffer = buffer[len(buffer)-BufferTrimSize:] } return check() } func check() bool { teleString := buffer if strings.Contains(teleString, EndTag) { loc := exp.FindStringIndex(teleString) if loc != nil { telegram := teleString[loc[0]:loc[1]] telegram = removeEmpty(telegram) + "\n\n" telegram += "\n" _, _ = RawLog.Write([]byte(telegram + "\n")) buffer = teleString[loc[1]:] // 先持久化,再发送:即使发送失败,数据已安全落盘 if err := InsertTelegram(telegram); err != nil { Log.Error("error in save telegram to db", zap.Error(err)) } if Pulsar { if err := PulsarSend(telegram); err != nil { Log.Error("error in send to pulsar", zap.Error(err)) } } return true } } return false } func removeEmpty(s string) string { return regexp.MustCompile(`[\t\r\n]+`).ReplaceAllString(strings.TrimSpace(s), "\n") }