package main import ( "fmt" "github.com/sirupsen/logrus" "github.com/hashicorp/go-retryablehttp" ) type LeveledLogrus struct { *logrus.Logger } func (l *LeveledLogrus) fields(keysAndValues ...interface{}) map[string]interface{} { fields := make(map[string]interface{}) for i := 0; i < len(keysAndValues); i += 2 { fields[keysAndValues[i].(string)] = keysAndValues[i+1] } return fields } func (l *LeveledLogrus) Error(msg string, keysAndValues ...interface{}) { l.Logger.WithFields(l.fields(keysAndValues...)).Error(msg) } func (l *LeveledLogrus) Info(msg string, keysAndValues ...interface{}) { l.Logger.WithFields(l.fields(keysAndValues...)).Info(msg) } func (l *LeveledLogrus) Debug(msg string, keysAndValues ...interface{}) { l.Logger.WithFields(l.fields(keysAndValues...)).Debug(msg) } func (l *LeveledLogrus) Warn(msg string, keysAndValues ...interface{}) { l.Logger.WithFields(l.fields(keysAndValues...)).Warn(msg) } func main() { log := logrus.New() logger := retryablehttp.LeveledLogger(&LeveledLogrus{log}) logger.Info("hello", "name", "world", "age", 2020) fmt.Printf("%T\n", logger) }