pkg/xcontext/logger/logadapter/zap/wrapper.go (63 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. // // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. package zap import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "github.com/facebookincubator/contest/pkg/xcontext/fields" "github.com/facebookincubator/contest/pkg/xcontext/logger" "github.com/facebookincubator/contest/pkg/xcontext/logger/internal" ) var ( _ internal.LoggerCompact = Wrapper{} ) type Fields = fields.Fields func wrap(backend *zap.SugaredLogger) logger.Logger { // Each structured logger has own types and we do intermediate methods // to convert one types to another. And to do not duplicate // Debugf/Infof/... in each such adapter we define only Logf // and unroll it using internal.UncompactLoggerCompact. return internal.UncompactLoggerCompact{ LoggerCompact: Wrapper{ Backend: backend, }, } } // Wrapper converts *zap.SugaredLogger to internal.LoggerCompact (which could be // easily converted to logger.Logger). type Wrapper struct { Backend *zap.SugaredLogger } // Logf implements internal.MinimalLoggerCompact. func (l Wrapper) Logf(level logger.Level, format string, args ...interface{}) { // Passing through "format" for better automatic error categorization // by Sentry-like services. This way we can detect which exactly // Errorf line was used even when lines being shifted up and down. internal.MinimalLoggerLogf(l.Backend.Named(format), level, format, args...) } // OriginalLogger implements internal.LoggerExtensions. func (l Wrapper) OriginalLogger() interface{} { return l.Backend } // Level implements internal.WithLevels. func (l Wrapper) Level() logger.Level { enabledFn := l.Backend.Desugar().Core().Enabled for _, level := range []zapcore.Level{ zap.DebugLevel, zap.InfoLevel, zap.WarnLevel, zap.ErrorLevel, zap.DPanicLevel, zap.PanicLevel, zap.FatalLevel, } { if enabledFn(level) { return Adapter.ConvertLevel(level) } } return logger.LevelUndefined } // WithLevel implements internal.WithLevels. func (l Wrapper) WithLevel(logLevel logger.Level) logger.Logger { return wrap( l.Backend.Desugar(). WithOptions( zap.IncreaseLevel(Adapter.Level(logLevel)), ).Sugar(), ) } // WithField implements internal.WithFields. func (l Wrapper) WithField(field string, value interface{}) logger.Logger { return wrap(l.Backend.With(field, value)) } // WithFields implements internal.WithFields. func (l Wrapper) WithFields(fields Fields) logger.Logger { args := make([]interface{}, 0, len(fields)*2) for k, v := range fields { args = append(args, k, v) } return wrap(l.Backend.With(args...)) }