package logger import ( "context" "go.uber.org/zap" "spark-server/internal/pkg/reqctx" ) type ctxKey struct{} func Nop() *zap.Logger { return zap.NewNop() } func With(ctx context.Context, log *zap.Logger) context.Context { return context.WithValue(ctx, ctxKey{}, log) } func From(ctx context.Context) *zap.Logger { if ctx == nil { return zap.NewNop() } if log, ok := ctx.Value(ctxKey{}).(*zap.Logger); ok && log != nil { return log } return zap.NewNop() } // Attach stores a logger on ctx with request_id from RequestContext. func Attach(ctx context.Context, base *zap.Logger) context.Context { if base == nil { base = zap.NewNop() } return With(ctx, WithReq(base, reqctx.From(ctx))) } func WithReq(log *zap.Logger, rc *reqctx.RequestContext) *zap.Logger { if log == nil { log = zap.NewNop() } if rc == nil { return log } fields := make([]zap.Field, 0, 8) if rc.RequestID != "" { fields = append(fields, zap.String("request_id", rc.RequestID)) } if rc.ConnectionID != "" { fields = append(fields, zap.String("connection_id", rc.ConnectionID)) } if rc.RealIP != "" { fields = append(fields, zap.String("real_ip", rc.RealIP)) } if rc.Language != "" { fields = append(fields, zap.String("lang", rc.Language)) } if rc.UserID != 0 { fields = append(fields, zap.Int64("user_id", rc.UserID)) } if len(fields) == 0 { return log } return log.With(fields...) }