github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/common/flogging/zap.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package flogging 8 9 import ( 10 "fmt" 11 "strings" 12 13 "go.uber.org/zap" 14 "go.uber.org/zap/zapcore" 15 "go.uber.org/zap/zapgrpc" 16 ) 17 18 // NewZapLogger creates a zap logger around a new zap.Core. The core will use 19 // the provided encoder and sinks and a level enabler that is associated with 20 // the provided logger name. The logger that is returned will be named the same 21 // as the logger. 22 func NewZapLogger(core zapcore.Core, options ...zap.Option) *zap.Logger { 23 return zap.New( 24 core, 25 append([]zap.Option{ 26 zap.AddCaller(), 27 zap.AddStacktrace(zapcore.ErrorLevel), 28 }, options...)..., 29 ) 30 } 31 32 // NewGRPCLogger creates a grpc.Logger that delegates to a zap.Logger. 33 func NewGRPCLogger(l *zap.Logger) *zapgrpc.Logger { 34 l = l.WithOptions( 35 zap.AddCaller(), 36 zap.AddCallerSkip(3), 37 ) 38 return zapgrpc.NewLogger(l, zapgrpc.WithDebug()) 39 } 40 41 // NewFabricLogger creates a logger that delegates to the zap.SugaredLogger. 42 func NewFabricLogger(l *zap.Logger, options ...zap.Option) *FabricLogger { 43 return &FabricLogger{ 44 s: l.WithOptions(append(options, zap.AddCallerSkip(1))...).Sugar(), 45 } 46 } 47 48 // A FabricLogger is an adapter around a zap.SugaredLogger that provides 49 // structured logging capabilities while preserving much of the legacy logging 50 // behavior. 51 // 52 // The most significant difference between the FabricLogger and the 53 // zap.SugaredLogger is that methods without a formatting suffix (f or w) build 54 // the log entry message with fmt.Sprintln instead of fmt.Sprint. Without this 55 // change, arguments are not separated by spaces. 56 type FabricLogger struct{ s *zap.SugaredLogger } 57 58 func (f *FabricLogger) DPanic(args ...interface{}) { f.s.DPanicf(formatArgs(args)) } 59 func (f *FabricLogger) DPanicf(template string, args ...interface{}) { f.s.DPanicf(template, args...) } 60 func (f *FabricLogger) DPanicw(msg string, kvPairs ...interface{}) { f.s.DPanicw(msg, kvPairs...) } 61 func (f *FabricLogger) Debug(args ...interface{}) { f.s.Debugf(formatArgs(args)) } 62 func (f *FabricLogger) Debugf(template string, args ...interface{}) { f.s.Debugf(template, args...) } 63 func (f *FabricLogger) Debugw(msg string, kvPairs ...interface{}) { f.s.Debugw(msg, kvPairs...) } 64 func (f *FabricLogger) Error(args ...interface{}) { f.s.Errorf(formatArgs(args)) } 65 func (f *FabricLogger) Errorf(template string, args ...interface{}) { f.s.Errorf(template, args...) } 66 func (f *FabricLogger) Errorw(msg string, kvPairs ...interface{}) { f.s.Errorw(msg, kvPairs...) } 67 func (f *FabricLogger) Fatal(args ...interface{}) { f.s.Fatalf(formatArgs(args)) } 68 func (f *FabricLogger) Fatalf(template string, args ...interface{}) { f.s.Fatalf(template, args...) } 69 func (f *FabricLogger) Fatalw(msg string, kvPairs ...interface{}) { f.s.Fatalw(msg, kvPairs...) } 70 func (f *FabricLogger) Info(args ...interface{}) { f.s.Infof(formatArgs(args)) } 71 func (f *FabricLogger) Infof(template string, args ...interface{}) { f.s.Infof(template, args...) } 72 func (f *FabricLogger) Infow(msg string, kvPairs ...interface{}) { f.s.Infow(msg, kvPairs...) } 73 func (f *FabricLogger) Panic(args ...interface{}) { f.s.Panicf(formatArgs(args)) } 74 func (f *FabricLogger) Panicf(template string, args ...interface{}) { f.s.Panicf(template, args...) } 75 func (f *FabricLogger) Panicw(msg string, kvPairs ...interface{}) { f.s.Panicw(msg, kvPairs...) } 76 func (f *FabricLogger) Warn(args ...interface{}) { f.s.Warnf(formatArgs(args)) } 77 func (f *FabricLogger) Warnf(template string, args ...interface{}) { f.s.Warnf(template, args...) } 78 func (f *FabricLogger) Warnw(msg string, kvPairs ...interface{}) { f.s.Warnw(msg, kvPairs...) } 79 func (f *FabricLogger) Warning(args ...interface{}) { f.s.Warnf(formatArgs(args)) } 80 func (f *FabricLogger) Warningf(template string, args ...interface{}) { f.s.Warnf(template, args...) } 81 82 // for backwards compatibility 83 func (f *FabricLogger) Critical(args ...interface{}) { f.s.Errorf(formatArgs(args)) } 84 func (f *FabricLogger) Criticalf(template string, args ...interface{}) { f.s.Errorf(template, args...) } 85 func (f *FabricLogger) Notice(args ...interface{}) { f.s.Infof(formatArgs(args)) } 86 func (f *FabricLogger) Noticef(template string, args ...interface{}) { f.s.Infof(template, args...) } 87 88 func (f *FabricLogger) Named(name string) *FabricLogger { return &FabricLogger{s: f.s.Named(name)} } 89 func (f *FabricLogger) Sync() error { return f.s.Sync() } 90 func (f *FabricLogger) Zap() *zap.Logger { return f.s.Desugar() } 91 92 func (f *FabricLogger) IsEnabledFor(level zapcore.Level) bool { 93 return f.s.Desugar().Core().Enabled(level) 94 } 95 96 func (f *FabricLogger) With(args ...interface{}) *FabricLogger { 97 return &FabricLogger{s: f.s.With(args...)} 98 } 99 100 func (f *FabricLogger) WithOptions(opts ...zap.Option) *FabricLogger { 101 l := f.s.Desugar().WithOptions(opts...) 102 return &FabricLogger{s: l.Sugar()} 103 } 104 105 func formatArgs(args []interface{}) string { return strings.TrimSuffix(fmt.Sprintln(args...), "\n") }