Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout. Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
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 trace_id / 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.TraceID != "" {
|
|
fields = append(fields, zap.String("trace_id", rc.TraceID))
|
|
}
|
|
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...)
|
|
}
|