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 }