修复bug

This commit is contained in:
2025-11-18 17:21:04 +08:00
parent 32abff626e
commit 200a358933
3 changed files with 170 additions and 59 deletions

View File

@@ -1,8 +1,6 @@
package logs
import (
"bytes"
"go.uber.org/zap/buffer"
"go.uber.org/zap/zapcore"
)
@@ -24,43 +22,16 @@ func NewColoredConsoleEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
}
}
// EncodeEntry 重写了核心的编码方法。
// EncodeEntry 重写了核心的编码方法。
func (c *coloredConsoleEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {
// 1. 从所有字段中分离出“调用链”字段和其他字段
var traceField zapcore.Field
otherFields := make([]zapcore.Field, 0, len(fields))
for _, field := range fields {
if field.Key == traceKey {
traceField = field
} else {
otherFields = append(otherFields, field)
}
}
// 2. 使用内嵌的 ConsoleEncoder 先编码日志条目和“其他”字段
// 这会生成不包含调用链的日志主体部分。
line, err := c.Encoder.EncodeEntry(entry, otherFields)
// 1. 直接使用内嵌的 Encoder 编码日志条目和所有字段。
line, err := c.Encoder.EncodeEntry(entry, fields)
if err != nil {
return nil, err
}
// 3. 如果存在“调用链”字段,则将其手动编码并追加到末尾
if traceField.Key != "" {
// 为了保持格式一致,我们创建一个临时的 Encoder 来只编码这一个字段
// 注意:这里我们不能直接使用 c.Encoder因为它会添加不必要的前缀如时间、级别等
tempEncoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{})
traceLine, err := tempEncoder.EncodeEntry(zapcore.Entry{}, []zapcore.Field{traceField})
if err != nil {
return nil, err // 理论上不应失败
}
// 将编码后的调用链字段(例如 "逻辑调用链=xxx->yyy")追加到日志主体后
// TrimSpace 用于移除 tempEncoder 可能产生的额外换行符
line.AppendString("\t") // 使用制表符分隔
line.AppendString(string(bytes.TrimSpace(traceLine.Bytes())))
}
// 4. 为最终的日志行(不包括调用链)添加颜色
// 2. 为最终的日志行添加颜色。
var color string
switch entry.Level {
case zapcore.DebugLevel:
@@ -77,14 +48,14 @@ func (c *coloredConsoleEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcor
color = reset
}
// 创建一个新的 buffer将颜色、日志内容和重置代码包裹起来
// 3. 创建一个新的 buffer将颜色、日志内容和重置代码包裹起来
finalBuf := buffer.NewPool().Get()
finalBuf.AppendString(color)
finalBuf.Write(line.Bytes()) // 写入已包含调用链的日志行
finalBuf.Write(line.Bytes())
finalBuf.AppendString(reset)
// 如果原始日志行末尾没有换行符,则添加一个
if line.Bytes()[line.Len()-1] != '\n' {
// 4. 如果原始日志行末尾没有换行符,则添加一个
if line.Len() > 0 && line.Bytes()[line.Len()-1] != '\n' {
finalBuf.AppendByte('\n')
}