让调用链信息永远在日志最末尾
This commit is contained in:
@@ -14,7 +14,6 @@ import (
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/config"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/buffer"
|
||||
"go.uber.org/zap/zapcore"
|
||||
"gopkg.in/natefinch/lumberjack.v2"
|
||||
gormlogger "gorm.io/gorm/logger"
|
||||
@@ -97,8 +96,8 @@ func GetLogger(ctx context.Context) *Logger {
|
||||
return defaultLogger
|
||||
}
|
||||
|
||||
// 使用 With 方法创建带有 "trace" 字段的 Logger 副本
|
||||
newSugaredLogger := defaultLogger.With("trace", strings.Join(chain, "->"))
|
||||
// 使用 With 方法创建带有 traceKey 字段的 Logger 副本
|
||||
newSugaredLogger := defaultLogger.With(traceKey, strings.Join(chain, "->"))
|
||||
return &Logger{newSugaredLogger}
|
||||
}
|
||||
|
||||
@@ -111,6 +110,14 @@ func Trace(upstreamCtx context.Context, selfCtx context.Context, funcName string
|
||||
return newCtx, logger
|
||||
}
|
||||
|
||||
// TraceLogger 类似于 Trace,但只返回一个包含完整调用链的 Logger 实例,
|
||||
// 而不返回更新后的 Context。适用于调用链的末端或不需要向下传递 Context 的场景。
|
||||
func TraceLogger(upstreamCtx context.Context, selfCtx context.Context, funcName string) *Logger {
|
||||
newCtx := AddFuncName(upstreamCtx, selfCtx, funcName)
|
||||
logger := GetLogger(newCtx)
|
||||
return logger
|
||||
}
|
||||
|
||||
// GetEncoder 根据指定的格式返回一个 zapcore.Encoder。
|
||||
func GetEncoder(format string) zapcore.Encoder {
|
||||
encoderConfig := zap.NewProductionEncoderConfig()
|
||||
@@ -124,63 +131,6 @@ func GetEncoder(format string) zapcore.Encoder {
|
||||
return NewColoredConsoleEncoder(encoderConfig)
|
||||
}
|
||||
|
||||
// coloredConsoleEncoder 是一个自定义的 zapcore.Encoder,用于为整个日志行添加颜色。
|
||||
type coloredConsoleEncoder struct {
|
||||
zapcore.Encoder // 嵌入默认的 ConsoleEncoder,以便委托其大部分功能
|
||||
cfg zapcore.EncoderConfig
|
||||
}
|
||||
|
||||
// NewColoredConsoleEncoder 创建一个新的 coloredConsoleEncoder 实例。
|
||||
func NewColoredConsoleEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
|
||||
// 创建一个标准的 ConsoleEncoder 作为基础
|
||||
baseEncoder := zapcore.NewConsoleEncoder(cfg)
|
||||
return &coloredConsoleEncoder{
|
||||
Encoder: baseEncoder,
|
||||
cfg: cfg,
|
||||
}
|
||||
}
|
||||
|
||||
// EncodeEntry 重写 EncodeEntry 方法,在原始日志输出前后添加颜色代码。
|
||||
func (c *coloredConsoleEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {
|
||||
// 首先,让嵌入的默认编码器生成原始的日志行
|
||||
buf, err := c.Encoder.EncodeEntry(entry, fields)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 根据日志级别确定颜色
|
||||
var color string
|
||||
switch entry.Level {
|
||||
case zapcore.DebugLevel:
|
||||
color = blue
|
||||
case zapcore.InfoLevel:
|
||||
color = green
|
||||
case zapcore.WarnLevel:
|
||||
color = yellow
|
||||
case zapcore.ErrorLevel:
|
||||
color = red
|
||||
case zapcore.DPanicLevel, zapcore.PanicLevel, zapcore.FatalLevel:
|
||||
color = bold + red
|
||||
default:
|
||||
color = reset
|
||||
}
|
||||
|
||||
// 创建一个新的 buffer 来存储带颜色的日志行
|
||||
coloredBuf := buffer.NewPool().Get()
|
||||
coloredBuf.AppendString(color)
|
||||
coloredBuf.Write(buf.Bytes())
|
||||
coloredBuf.AppendString(reset)
|
||||
|
||||
buf.Free() // 释放原始 buffer 回池中
|
||||
|
||||
return coloredBuf, nil
|
||||
}
|
||||
|
||||
// Clone 方法也需要重写,以确保返回一个新的 coloredConsoleEncoder 实例。
|
||||
func (c *coloredConsoleEncoder) Clone() zapcore.Encoder {
|
||||
return NewColoredConsoleEncoder(c.cfg)
|
||||
}
|
||||
|
||||
// getWriteSyncer 根据配置创建日志写入目标。
|
||||
func getWriteSyncer(cfg config.LogConfig) zapcore.WriteSyncer {
|
||||
writers := []zapcore.WriteSyncer{os.Stdout}
|
||||
|
||||
Reference in New Issue
Block a user