github.com/newrelic/newrelic-client-go@v1.1.0/pkg/logging/logrus_logger.go (about)

     1  package logging
     2  
     3  import (
     4  	"fmt"
     5  
     6  	log "github.com/sirupsen/logrus"
     7  )
     8  
     9  var (
    10  	defaultFields   map[string]string
    11  	defaultLogLevel = "info"
    12  )
    13  
    14  // LogrusLogger is a logger based on logrus.
    15  type LogrusLogger struct {
    16  	logger *log.Logger
    17  }
    18  
    19  type ConfigOption func(*LogrusLogger)
    20  
    21  func ConfigLoggerInstance(logger *log.Logger) ConfigOption {
    22  	return func(l *LogrusLogger) {
    23  		l.logger = logger
    24  	}
    25  }
    26  
    27  // NewLogrusLogger creates a new structured logger.
    28  func NewLogrusLogger(opts ...ConfigOption) *LogrusLogger {
    29  	l := &LogrusLogger{
    30  		logger: log.New(),
    31  	}
    32  
    33  	// Loop through config options
    34  	for _, fn := range opts {
    35  		if nil != fn {
    36  			fn(l)
    37  		}
    38  	}
    39  
    40  	return l
    41  }
    42  
    43  // SetLevel allows the log level to be set.
    44  func (l LogrusLogger) SetLevel(levelName string) {
    45  	if levelName == "" {
    46  		levelName = defaultLogLevel
    47  	}
    48  
    49  	level, err := log.ParseLevel(levelName)
    50  	if err != nil {
    51  		l.logger.Warn(fmt.Sprintf("could not parse log level '%s', logging will proceed at %s level", levelName, defaultLogLevel))
    52  		level, _ = log.ParseLevel(defaultLogLevel)
    53  	}
    54  
    55  	l.logger.SetLevel(level)
    56  }
    57  
    58  // LogJSON determines whether or not to format the logs as JSON.
    59  func (l LogrusLogger) SetLogJSON(value bool) {
    60  	if value {
    61  		l.logger.SetFormatter(&log.JSONFormatter{})
    62  	}
    63  }
    64  
    65  // SetDefaultFields sets fields to be logged on every use of the logger.
    66  func (l LogrusLogger) SetDefaultFields(defaultFields map[string]string) {
    67  	l.logger.AddHook(&defaultFieldHook{})
    68  }
    69  
    70  // Error logs an error message.
    71  func (l LogrusLogger) Error(msg string, fields ...interface{}) {
    72  	l.logger.WithFields(createFieldMap(fields)).Error(msg)
    73  }
    74  
    75  // Warn logs an warning message.
    76  func (l LogrusLogger) Warn(msg string, fields ...interface{}) {
    77  	l.logger.WithFields(createFieldMap(fields)).Warn(msg)
    78  }
    79  
    80  // Info logs an info message.
    81  func (l LogrusLogger) Info(msg string, fields ...interface{}) {
    82  	l.logger.WithFields(createFieldMap(fields)).Info(msg)
    83  }
    84  
    85  // Debug logs a debug message.
    86  func (l LogrusLogger) Debug(msg string, fields ...interface{}) {
    87  	l.logger.WithFields(createFieldMap(fields)).Debug(msg)
    88  }
    89  
    90  // Trace logs a trace message.
    91  func (l LogrusLogger) Trace(msg string, fields ...interface{}) {
    92  	l.logger.WithFields(createFieldMap(fields)).Trace(msg)
    93  }
    94  
    95  func createFieldMap(fields ...interface{}) map[string]interface{} {
    96  	m := map[string]interface{}{}
    97  
    98  	fields = fields[0].([]interface{})
    99  
   100  	for i := 0; i < len(fields); i += 2 {
   101  		m[fields[i].(string)] = fields[i+1]
   102  	}
   103  
   104  	return m
   105  }
   106  
   107  type defaultFieldHook struct{}
   108  
   109  func (h *defaultFieldHook) Levels() []log.Level {
   110  	return log.AllLevels
   111  }
   112  
   113  func (h *defaultFieldHook) Fire(e *log.Entry) error {
   114  	for k, v := range defaultFields {
   115  		e.Data[k] = v
   116  	}
   117  	return nil
   118  }