fields.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package logx
  2. import (
  3. "context"
  4. "sync"
  5. "sync/atomic"
  6. )
  7. var (
  8. fieldsContextKey contextKey
  9. globalFields atomic.Value
  10. globalFieldsLock sync.Mutex
  11. )
  12. type contextKey struct{}
  13. // AddGlobalFields adds global fields.
  14. func AddGlobalFields(fields ...LogField) {
  15. globalFieldsLock.Lock()
  16. defer globalFieldsLock.Unlock()
  17. old := globalFields.Load()
  18. if old == nil {
  19. globalFields.Store(append([]LogField(nil), fields...))
  20. } else {
  21. globalFields.Store(append(old.([]LogField), fields...))
  22. }
  23. }
  24. // ContextWithFields returns a new context with the given fields.
  25. func ContextWithFields(ctx context.Context, fields ...LogField) context.Context {
  26. if val := ctx.Value(fieldsContextKey); val != nil {
  27. if arr, ok := val.([]LogField); ok {
  28. allFields := make([]LogField, 0, len(arr)+len(fields))
  29. allFields = append(allFields, arr...)
  30. allFields = append(allFields, fields...)
  31. return context.WithValue(ctx, fieldsContextKey, allFields)
  32. }
  33. }
  34. return context.WithValue(ctx, fieldsContextKey, fields)
  35. }
  36. // WithFields returns a new logger with the given fields.
  37. // deprecated: use ContextWithFields instead.
  38. func WithFields(ctx context.Context, fields ...LogField) context.Context {
  39. return ContextWithFields(ctx, fields...)
  40. }