123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package logx
- import (
- "context"
- "sync"
- "sync/atomic"
- )
- var (
- fieldsContextKey contextKey
- globalFields atomic.Value
- globalFieldsLock sync.Mutex
- )
- type contextKey struct{}
- // AddGlobalFields adds global fields.
- func AddGlobalFields(fields ...LogField) {
- globalFieldsLock.Lock()
- defer globalFieldsLock.Unlock()
- old := globalFields.Load()
- if old == nil {
- globalFields.Store(append([]LogField(nil), fields...))
- } else {
- globalFields.Store(append(old.([]LogField), fields...))
- }
- }
- // ContextWithFields returns a new context with the given fields.
- func ContextWithFields(ctx context.Context, fields ...LogField) context.Context {
- if val := ctx.Value(fieldsContextKey); val != nil {
- if arr, ok := val.([]LogField); ok {
- allFields := make([]LogField, 0, len(arr)+len(fields))
- allFields = append(allFields, arr...)
- allFields = append(allFields, fields...)
- return context.WithValue(ctx, fieldsContextKey, allFields)
- }
- }
- return context.WithValue(ctx, fieldsContextKey, fields)
- }
- // WithFields returns a new logger with the given fields.
- // deprecated: use ContextWithFields instead.
- func WithFields(ctx context.Context, fields ...LogField) context.Context {
- return ContextWithFields(ctx, fields...)
- }
|