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  }