github.com/shogo82148/goa-v1@v1.6.2/logging/logrus/adapter.go (about) 1 /* 2 Package goalogrus contains an adapter that makes it possible to configure goa so it uses logrus 3 as logger backend. 4 Usage: 5 6 logger := logrus.New() 7 // Initialize logger handler using logrus package 8 service.WithLogger(goalogrus.New(logger)) 9 // ... Proceed with configuring and starting the goa service 10 11 // In handlers: 12 goalogrus.Entry(ctx).Info("foo", "bar") 13 */ 14 package goalogrus 15 16 import ( 17 "context" 18 "fmt" 19 20 "github.com/shogo82148/goa-v1" 21 "github.com/sirupsen/logrus" 22 ) 23 24 // adapter is the logrus goa logger adapter. 25 type adapter struct { 26 *logrus.Entry 27 } 28 29 // New wraps a logrus logger into a goa logger. 30 func New(logger *logrus.Logger) goa.LogAdapter { 31 return FromEntry(logrus.NewEntry(logger)) 32 } 33 34 // FromEntry wraps a logrus log entry into a goa logger. 35 func FromEntry(entry *logrus.Entry) goa.LogAdapter { 36 return &adapter{Entry: entry} 37 } 38 39 // Entry returns the logrus log entry stored in the given context if any, nil otherwise. 40 func Entry(ctx context.Context) *logrus.Entry { 41 logger := goa.ContextLogger(ctx) 42 if a, ok := logger.(*adapter); ok { 43 return a.Entry 44 } 45 return nil 46 } 47 48 // Info logs messages using logrus. 49 func (a *adapter) Info(msg string, data ...interface{}) { 50 a.Entry.WithFields(data2rus(data)).Info(msg) 51 } 52 53 // Warn logs message using logrus. 54 func (a *adapter) Warn(msg string, data ...interface{}) { 55 a.Entry.WithFields(data2rus(data)).Warn(msg) 56 } 57 58 // Error logs errors using logrus. 59 func (a *adapter) Error(msg string, data ...interface{}) { 60 a.Entry.WithFields(data2rus(data)).Error(msg) 61 } 62 63 // New creates a new logger given a context. 64 func (a *adapter) New(data ...interface{}) goa.LogAdapter { 65 return &adapter{Entry: a.Entry.WithFields(data2rus(data))} 66 } 67 68 func data2rus(keyvals []interface{}) logrus.Fields { 69 n := (len(keyvals) + 1) / 2 70 res := make(logrus.Fields, n) 71 for i := 0; i < len(keyvals); i += 2 { 72 k := keyvals[i] 73 var v interface{} = goa.ErrMissingLogValue 74 if i+1 < len(keyvals) { 75 v = keyvals[i+1] 76 } 77 res[fmt.Sprintf("%v", k)] = v 78 } 79 return res 80 }