Update dependencies for logrus rename
Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
		
							
								
								
									
										100
									
								
								vendor/github.com/sirupsen/logrus/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/sirupsen/logrus/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,100 +0,0 @@ | ||||
| # 1.0.0 | ||||
|  | ||||
| * Officially changed name to lower-case | ||||
| * bug: colors on Windows 10 (#541) | ||||
| * bug: fix race in accessing level (#512) | ||||
|  | ||||
| # 0.11.5 | ||||
|  | ||||
| * feature: add writer and writerlevel to entry (#372) | ||||
|  | ||||
| # 0.11.4 | ||||
|  | ||||
| * bug: fix undefined variable on solaris (#493) | ||||
|  | ||||
| # 0.11.3 | ||||
|  | ||||
| * formatter: configure quoting of empty values (#484) | ||||
| * formatter: configure quoting character (default is `"`) (#484) | ||||
| * bug: fix not importing io correctly in non-linux environments (#481) | ||||
|  | ||||
| # 0.11.2 | ||||
|  | ||||
| * bug: fix windows terminal detection (#476) | ||||
|  | ||||
| # 0.11.1 | ||||
|  | ||||
| * bug: fix tty detection with custom out (#471) | ||||
|  | ||||
| # 0.11.0 | ||||
|  | ||||
| * performance: Use bufferpool to allocate (#370) | ||||
| * terminal: terminal detection for app-engine (#343) | ||||
| * feature: exit handler (#375) | ||||
|  | ||||
| # 0.10.0 | ||||
|  | ||||
| * feature: Add a test hook (#180) | ||||
| * feature: `ParseLevel` is now case-insensitive (#326) | ||||
| * feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) | ||||
| * performance: avoid re-allocations on `WithFields` (#335) | ||||
|  | ||||
| # 0.9.0 | ||||
|  | ||||
| * logrus/text_formatter: don't emit empty msg | ||||
| * logrus/hooks/airbrake: move out of main repository | ||||
| * logrus/hooks/sentry: move out of main repository | ||||
| * logrus/hooks/papertrail: move out of main repository | ||||
| * logrus/hooks/bugsnag: move out of main repository | ||||
| * logrus/core: run tests with `-race` | ||||
| * logrus/core: detect TTY based on `stderr` | ||||
| * logrus/core: support `WithError` on logger | ||||
| * logrus/core: Solaris support | ||||
|  | ||||
| # 0.8.7 | ||||
|  | ||||
| * logrus/core: fix possible race (#216) | ||||
| * logrus/doc: small typo fixes and doc improvements | ||||
|  | ||||
|  | ||||
| # 0.8.6 | ||||
|  | ||||
| * hooks/raven: allow passing an initialized client | ||||
|  | ||||
| # 0.8.5 | ||||
|  | ||||
| * logrus/core: revert #208 | ||||
|  | ||||
| # 0.8.4 | ||||
|  | ||||
| * formatter/text: fix data race (#218) | ||||
|  | ||||
| # 0.8.3 | ||||
|  | ||||
| * logrus/core: fix entry log level (#208) | ||||
| * logrus/core: improve performance of text formatter by 40% | ||||
| * logrus/core: expose `LevelHooks` type | ||||
| * logrus/core: add support for DragonflyBSD and NetBSD | ||||
| * formatter/text: print structs more verbosely | ||||
|  | ||||
| # 0.8.2 | ||||
|  | ||||
| * logrus: fix more Fatal family functions | ||||
|  | ||||
| # 0.8.1 | ||||
|  | ||||
| * logrus: fix not exiting on `Fatalf` and `Fatalln` | ||||
|  | ||||
| # 0.8.0 | ||||
|  | ||||
| * logrus: defaults to stderr instead of stdout | ||||
| * hooks/sentry: add special field for `*http.Request` | ||||
| * formatter/text: ignore Windows for colors | ||||
|  | ||||
| # 0.7.3 | ||||
|  | ||||
| * formatter/\*: allow configuration of timestamp layout | ||||
|  | ||||
| # 0.7.2 | ||||
|  | ||||
| * formatter/text: Add configuration option for time format (#158) | ||||
							
								
								
									
										74
									
								
								vendor/github.com/sirupsen/logrus/alt_exit_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/sirupsen/logrus/alt_exit_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,74 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"io/ioutil" | ||||
| 	"os/exec" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func TestRegister(t *testing.T) { | ||||
| 	current := len(handlers) | ||||
| 	RegisterExitHandler(func() {}) | ||||
| 	if len(handlers) != current+1 { | ||||
| 		t.Fatalf("can't add handler") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestHandler(t *testing.T) { | ||||
| 	gofile := "/tmp/testprog.go" | ||||
| 	if err := ioutil.WriteFile(gofile, testprog, 0666); err != nil { | ||||
| 		t.Fatalf("can't create go file") | ||||
| 	} | ||||
|  | ||||
| 	outfile := "/tmp/testprog.out" | ||||
| 	arg := time.Now().UTC().String() | ||||
| 	err := exec.Command("go", "run", gofile, outfile, arg).Run() | ||||
| 	if err == nil { | ||||
| 		t.Fatalf("completed normally, should have failed") | ||||
| 	} | ||||
|  | ||||
| 	data, err := ioutil.ReadFile(outfile) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("can't read output file %s", outfile) | ||||
| 	} | ||||
|  | ||||
| 	if string(data) != arg { | ||||
| 		t.Fatalf("bad data") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var testprog = []byte(` | ||||
| // Test program for atexit, gets output file and data as arguments and writes | ||||
| // data to output file in atexit handler. | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| ) | ||||
|  | ||||
| var outfile = "" | ||||
| var data = "" | ||||
|  | ||||
| func handler() { | ||||
| 	ioutil.WriteFile(outfile, []byte(data), 0666) | ||||
| } | ||||
|  | ||||
| func badHandler() { | ||||
| 	n := 0 | ||||
| 	fmt.Println(1/n) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	outfile = flag.Arg(0) | ||||
| 	data = flag.Arg(1) | ||||
|  | ||||
| 	logrus.RegisterExitHandler(handler) | ||||
| 	logrus.RegisterExitHandler(badHandler) | ||||
| 	logrus.Fatal("Bye bye") | ||||
| } | ||||
| `) | ||||
							
								
								
									
										77
									
								
								vendor/github.com/sirupsen/logrus/entry_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/sirupsen/logrus/entry_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,77 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestEntryWithError(t *testing.T) { | ||||
|  | ||||
| 	assert := assert.New(t) | ||||
|  | ||||
| 	defer func() { | ||||
| 		ErrorKey = "error" | ||||
| 	}() | ||||
|  | ||||
| 	err := fmt.Errorf("kaboom at layer %d", 4711) | ||||
|  | ||||
| 	assert.Equal(err, WithError(err).Data["error"]) | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &bytes.Buffer{} | ||||
| 	entry := NewEntry(logger) | ||||
|  | ||||
| 	assert.Equal(err, entry.WithError(err).Data["error"]) | ||||
|  | ||||
| 	ErrorKey = "err" | ||||
|  | ||||
| 	assert.Equal(err, entry.WithError(err).Data["err"]) | ||||
|  | ||||
| } | ||||
|  | ||||
| func TestEntryPanicln(t *testing.T) { | ||||
| 	errBoom := fmt.Errorf("boom time") | ||||
|  | ||||
| 	defer func() { | ||||
| 		p := recover() | ||||
| 		assert.NotNil(t, p) | ||||
|  | ||||
| 		switch pVal := p.(type) { | ||||
| 		case *Entry: | ||||
| 			assert.Equal(t, "kaboom", pVal.Message) | ||||
| 			assert.Equal(t, errBoom, pVal.Data["err"]) | ||||
| 		default: | ||||
| 			t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &bytes.Buffer{} | ||||
| 	entry := NewEntry(logger) | ||||
| 	entry.WithField("err", errBoom).Panicln("kaboom") | ||||
| } | ||||
|  | ||||
| func TestEntryPanicf(t *testing.T) { | ||||
| 	errBoom := fmt.Errorf("boom again") | ||||
|  | ||||
| 	defer func() { | ||||
| 		p := recover() | ||||
| 		assert.NotNil(t, p) | ||||
|  | ||||
| 		switch pVal := p.(type) { | ||||
| 		case *Entry: | ||||
| 			assert.Equal(t, "kaboom true", pVal.Message) | ||||
| 			assert.Equal(t, errBoom, pVal.Data["err"]) | ||||
| 		default: | ||||
| 			t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &bytes.Buffer{} | ||||
| 	entry := NewEntry(logger) | ||||
| 	entry.WithField("err", errBoom).Panicf("kaboom %v", true) | ||||
| } | ||||
							
								
								
									
										59
									
								
								vendor/github.com/sirupsen/logrus/examples/basic/basic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								vendor/github.com/sirupsen/logrus/examples/basic/basic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,59 +0,0 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	// "os" | ||||
| ) | ||||
|  | ||||
| var log = logrus.New() | ||||
|  | ||||
| func init() { | ||||
| 	log.Formatter = new(logrus.JSONFormatter) | ||||
| 	log.Formatter = new(logrus.TextFormatter) // default | ||||
|  | ||||
| 	// file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) | ||||
| 	// if err == nil { | ||||
| 	// 	log.Out = file | ||||
| 	// } else { | ||||
| 	// 	log.Info("Failed to log to file, using default stderr") | ||||
| 	// } | ||||
|  | ||||
| 	log.Level = logrus.DebugLevel | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	defer func() { | ||||
| 		err := recover() | ||||
| 		if err != nil { | ||||
| 			log.WithFields(logrus.Fields{ | ||||
| 				"omg":    true, | ||||
| 				"err":    err, | ||||
| 				"number": 100, | ||||
| 			}).Fatal("The ice breaks!") | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"animal": "walrus", | ||||
| 		"number": 8, | ||||
| 	}).Debug("Started observing beach") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"animal": "walrus", | ||||
| 		"size":   10, | ||||
| 	}).Info("A group of walrus emerges from the ocean") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"omg":    true, | ||||
| 		"number": 122, | ||||
| 	}).Warn("The group's number increased tremendously!") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"temperature": -4, | ||||
| 	}).Debug("Temperature changes") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"animal": "orca", | ||||
| 		"size":   9009, | ||||
| 	}).Panic("It's over 9000!") | ||||
| } | ||||
							
								
								
									
										30
									
								
								vendor/github.com/sirupsen/logrus/examples/hook/hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/sirupsen/logrus/examples/hook/hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,30 +0,0 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"gopkg.in/gemnasium/logrus-airbrake-hook.v2" | ||||
| ) | ||||
|  | ||||
| var log = logrus.New() | ||||
|  | ||||
| func init() { | ||||
| 	log.Formatter = new(logrus.TextFormatter) // default | ||||
| 	log.Hooks.Add(airbrake.NewHook(123, "xyz", "development")) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"animal": "walrus", | ||||
| 		"size":   10, | ||||
| 	}).Info("A group of walrus emerges from the ocean") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"omg":    true, | ||||
| 		"number": 122, | ||||
| 	}).Warn("The group's number increased tremendously!") | ||||
|  | ||||
| 	log.WithFields(logrus.Fields{ | ||||
| 		"omg":    true, | ||||
| 		"number": 100, | ||||
| 	}).Fatal("The ice breaks!") | ||||
| } | ||||
							
								
								
									
										101
									
								
								vendor/github.com/sirupsen/logrus/formatter_bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										101
									
								
								vendor/github.com/sirupsen/logrus/formatter_bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,101 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // smallFields is a small size data set for benchmarking | ||||
| var smallFields = Fields{ | ||||
| 	"foo":   "bar", | ||||
| 	"baz":   "qux", | ||||
| 	"one":   "two", | ||||
| 	"three": "four", | ||||
| } | ||||
|  | ||||
| // largeFields is a large size data set for benchmarking | ||||
| var largeFields = Fields{ | ||||
| 	"foo":       "bar", | ||||
| 	"baz":       "qux", | ||||
| 	"one":       "two", | ||||
| 	"three":     "four", | ||||
| 	"five":      "six", | ||||
| 	"seven":     "eight", | ||||
| 	"nine":      "ten", | ||||
| 	"eleven":    "twelve", | ||||
| 	"thirteen":  "fourteen", | ||||
| 	"fifteen":   "sixteen", | ||||
| 	"seventeen": "eighteen", | ||||
| 	"nineteen":  "twenty", | ||||
| 	"a":         "b", | ||||
| 	"c":         "d", | ||||
| 	"e":         "f", | ||||
| 	"g":         "h", | ||||
| 	"i":         "j", | ||||
| 	"k":         "l", | ||||
| 	"m":         "n", | ||||
| 	"o":         "p", | ||||
| 	"q":         "r", | ||||
| 	"s":         "t", | ||||
| 	"u":         "v", | ||||
| 	"w":         "x", | ||||
| 	"y":         "z", | ||||
| 	"this":      "will", | ||||
| 	"make":      "thirty", | ||||
| 	"entries":   "yeah", | ||||
| } | ||||
|  | ||||
| var errorFields = Fields{ | ||||
| 	"foo": fmt.Errorf("bar"), | ||||
| 	"baz": fmt.Errorf("qux"), | ||||
| } | ||||
|  | ||||
| func BenchmarkErrorTextFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &TextFormatter{DisableColors: true}, errorFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkSmallTextFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &TextFormatter{DisableColors: true}, smallFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkLargeTextFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &TextFormatter{DisableColors: true}, largeFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkSmallColoredTextFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &TextFormatter{ForceColors: true}, smallFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkLargeColoredTextFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &TextFormatter{ForceColors: true}, largeFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkSmallJSONFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &JSONFormatter{}, smallFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkLargeJSONFormatter(b *testing.B) { | ||||
| 	doBenchmark(b, &JSONFormatter{}, largeFields) | ||||
| } | ||||
|  | ||||
| func doBenchmark(b *testing.B, formatter Formatter, fields Fields) { | ||||
| 	logger := New() | ||||
|  | ||||
| 	entry := &Entry{ | ||||
| 		Time:    time.Time{}, | ||||
| 		Level:   InfoLevel, | ||||
| 		Message: "message", | ||||
| 		Data:    fields, | ||||
| 		Logger:  logger, | ||||
| 	} | ||||
| 	var d []byte | ||||
| 	var err error | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		d, err = formatter.Format(entry) | ||||
| 		if err != nil { | ||||
| 			b.Fatal(err) | ||||
| 		} | ||||
| 		b.SetBytes(int64(len(d))) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										122
									
								
								vendor/github.com/sirupsen/logrus/hook_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										122
									
								
								vendor/github.com/sirupsen/logrus/hook_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,122 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| type TestHook struct { | ||||
| 	Fired bool | ||||
| } | ||||
|  | ||||
| func (hook *TestHook) Fire(entry *Entry) error { | ||||
| 	hook.Fired = true | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (hook *TestHook) Levels() []Level { | ||||
| 	return []Level{ | ||||
| 		DebugLevel, | ||||
| 		InfoLevel, | ||||
| 		WarnLevel, | ||||
| 		ErrorLevel, | ||||
| 		FatalLevel, | ||||
| 		PanicLevel, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestHookFires(t *testing.T) { | ||||
| 	hook := new(TestHook) | ||||
|  | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Hooks.Add(hook) | ||||
| 		assert.Equal(t, hook.Fired, false) | ||||
|  | ||||
| 		log.Print("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, hook.Fired, true) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| type ModifyHook struct { | ||||
| } | ||||
|  | ||||
| func (hook *ModifyHook) Fire(entry *Entry) error { | ||||
| 	entry.Data["wow"] = "whale" | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (hook *ModifyHook) Levels() []Level { | ||||
| 	return []Level{ | ||||
| 		DebugLevel, | ||||
| 		InfoLevel, | ||||
| 		WarnLevel, | ||||
| 		ErrorLevel, | ||||
| 		FatalLevel, | ||||
| 		PanicLevel, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestHookCanModifyEntry(t *testing.T) { | ||||
| 	hook := new(ModifyHook) | ||||
|  | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Hooks.Add(hook) | ||||
| 		log.WithField("wow", "elephant").Print("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["wow"], "whale") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestCanFireMultipleHooks(t *testing.T) { | ||||
| 	hook1 := new(ModifyHook) | ||||
| 	hook2 := new(TestHook) | ||||
|  | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Hooks.Add(hook1) | ||||
| 		log.Hooks.Add(hook2) | ||||
|  | ||||
| 		log.WithField("wow", "elephant").Print("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["wow"], "whale") | ||||
| 		assert.Equal(t, hook2.Fired, true) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| type ErrorHook struct { | ||||
| 	Fired bool | ||||
| } | ||||
|  | ||||
| func (hook *ErrorHook) Fire(entry *Entry) error { | ||||
| 	hook.Fired = true | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (hook *ErrorHook) Levels() []Level { | ||||
| 	return []Level{ | ||||
| 		ErrorLevel, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestErrorHookShouldntFireOnInfo(t *testing.T) { | ||||
| 	hook := new(ErrorHook) | ||||
|  | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Hooks.Add(hook) | ||||
| 		log.Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, hook.Fired, false) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestErrorHookShouldFireOnError(t *testing.T) { | ||||
| 	hook := new(ErrorHook) | ||||
|  | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Hooks.Add(hook) | ||||
| 		log.Error("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, hook.Fired, true) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										39
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,39 +0,0 @@ | ||||
| # Syslog Hooks for Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/> | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| ```go | ||||
| import ( | ||||
|   "log/syslog" | ||||
|   "github.com/sirupsen/logrus" | ||||
|   logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
|   log       := logrus.New() | ||||
|   hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") | ||||
|  | ||||
|   if err == nil { | ||||
|     log.Hooks.Add(hook) | ||||
|   } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| If you want to connect to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). Just assign empty string to the first two parameters of `NewSyslogHook`. It should look like the following. | ||||
|  | ||||
| ```go | ||||
| import ( | ||||
|   "log/syslog" | ||||
|   "github.com/sirupsen/logrus" | ||||
|   logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
|   log       := logrus.New() | ||||
|   hook, err := logrus_syslog.NewSyslogHook("", "", syslog.LOG_INFO, "") | ||||
|  | ||||
|   if err == nil { | ||||
|     log.Hooks.Add(hook) | ||||
|   } | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										54
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/syslog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/syslog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,54 +0,0 @@ | ||||
| // +build !windows,!nacl,!plan9 | ||||
|  | ||||
| package logrus_syslog | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"log/syslog" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| // SyslogHook to send logs via syslog. | ||||
| type SyslogHook struct { | ||||
| 	Writer        *syslog.Writer | ||||
| 	SyslogNetwork string | ||||
| 	SyslogRaddr   string | ||||
| } | ||||
|  | ||||
| // Creates a hook to be added to an instance of logger. This is called with | ||||
| // `hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_DEBUG, "")` | ||||
| // `if err == nil { log.Hooks.Add(hook) }` | ||||
| func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error) { | ||||
| 	w, err := syslog.Dial(network, raddr, priority, tag) | ||||
| 	return &SyslogHook{w, network, raddr}, err | ||||
| } | ||||
|  | ||||
| func (hook *SyslogHook) Fire(entry *logrus.Entry) error { | ||||
| 	line, err := entry.String() | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	switch entry.Level { | ||||
| 	case logrus.PanicLevel: | ||||
| 		return hook.Writer.Crit(line) | ||||
| 	case logrus.FatalLevel: | ||||
| 		return hook.Writer.Crit(line) | ||||
| 	case logrus.ErrorLevel: | ||||
| 		return hook.Writer.Err(line) | ||||
| 	case logrus.WarnLevel: | ||||
| 		return hook.Writer.Warning(line) | ||||
| 	case logrus.InfoLevel: | ||||
| 		return hook.Writer.Info(line) | ||||
| 	case logrus.DebugLevel: | ||||
| 		return hook.Writer.Debug(line) | ||||
| 	default: | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (hook *SyslogHook) Levels() []logrus.Level { | ||||
| 	return logrus.AllLevels | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/syslog_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/sirupsen/logrus/hooks/syslog/syslog_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,26 +0,0 @@ | ||||
| package logrus_syslog | ||||
|  | ||||
| import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"log/syslog" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestLocalhostAddAndPrint(t *testing.T) { | ||||
| 	log := logrus.New() | ||||
| 	hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") | ||||
|  | ||||
| 	if err != nil { | ||||
| 		t.Errorf("Unable to connect to local syslog.") | ||||
| 	} | ||||
|  | ||||
| 	log.Hooks.Add(hook) | ||||
|  | ||||
| 	for _, level := range hook.Levels() { | ||||
| 		if len(log.Hooks[level]) != 1 { | ||||
| 			t.Errorf("SyslogHook was not added. The length of log.Hooks[%v]: %v", level, len(log.Hooks[level])) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	log.Info("Congratulations!") | ||||
| } | ||||
							
								
								
									
										95
									
								
								vendor/github.com/sirupsen/logrus/hooks/test/test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/github.com/sirupsen/logrus/hooks/test/test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,95 +0,0 @@ | ||||
| // The Test package is used for testing logrus. It is here for backwards | ||||
| // compatibility from when logrus' organization was upper-case. Please use | ||||
| // lower-case logrus and the `null` package instead of this one. | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"io/ioutil" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| // Hook is a hook designed for dealing with logs in test scenarios. | ||||
| type Hook struct { | ||||
| 	// Entries is an array of all entries that have been received by this hook. | ||||
| 	// For safe access, use the AllEntries() method, rather than reading this | ||||
| 	// value directly. | ||||
| 	Entries []*logrus.Entry | ||||
| 	mu      sync.RWMutex | ||||
| } | ||||
|  | ||||
| // NewGlobal installs a test hook for the global logger. | ||||
| func NewGlobal() *Hook { | ||||
|  | ||||
| 	hook := new(Hook) | ||||
| 	logrus.AddHook(hook) | ||||
|  | ||||
| 	return hook | ||||
|  | ||||
| } | ||||
|  | ||||
| // NewLocal installs a test hook for a given local logger. | ||||
| func NewLocal(logger *logrus.Logger) *Hook { | ||||
|  | ||||
| 	hook := new(Hook) | ||||
| 	logger.Hooks.Add(hook) | ||||
|  | ||||
| 	return hook | ||||
|  | ||||
| } | ||||
|  | ||||
| // NewNullLogger creates a discarding logger and installs the test hook. | ||||
| func NewNullLogger() (*logrus.Logger, *Hook) { | ||||
|  | ||||
| 	logger := logrus.New() | ||||
| 	logger.Out = ioutil.Discard | ||||
|  | ||||
| 	return logger, NewLocal(logger) | ||||
|  | ||||
| } | ||||
|  | ||||
| func (t *Hook) Fire(e *logrus.Entry) error { | ||||
| 	t.mu.Lock() | ||||
| 	defer t.mu.Unlock() | ||||
| 	t.Entries = append(t.Entries, e) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (t *Hook) Levels() []logrus.Level { | ||||
| 	return logrus.AllLevels | ||||
| } | ||||
|  | ||||
| // LastEntry returns the last entry that was logged or nil. | ||||
| func (t *Hook) LastEntry() *logrus.Entry { | ||||
| 	t.mu.RLock() | ||||
| 	defer t.mu.RUnlock() | ||||
| 	i := len(t.Entries) - 1 | ||||
| 	if i < 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	// Make a copy, for safety | ||||
| 	e := *t.Entries[i] | ||||
| 	return &e | ||||
| } | ||||
|  | ||||
| // AllEntries returns all entries that were logged. | ||||
| func (t *Hook) AllEntries() []*logrus.Entry { | ||||
| 	t.mu.RLock() | ||||
| 	defer t.mu.RUnlock() | ||||
| 	// Make a copy so the returned value won't race with future log requests | ||||
| 	entries := make([]*logrus.Entry, len(t.Entries)) | ||||
| 	for i, entry := range t.Entries { | ||||
| 		// Make a copy, for safety | ||||
| 		e := *entry | ||||
| 		entries[i] = &e | ||||
| 	} | ||||
| 	return entries | ||||
| } | ||||
|  | ||||
| // Reset removes all Entries from this test hook. | ||||
| func (t *Hook) Reset() { | ||||
| 	t.mu.Lock() | ||||
| 	defer t.mu.Unlock() | ||||
| 	t.Entries = make([]*logrus.Entry, 0) | ||||
| } | ||||
							
								
								
									
										39
									
								
								vendor/github.com/sirupsen/logrus/hooks/test/test_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/sirupsen/logrus/hooks/test/test_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,39 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestAllHooks(t *testing.T) { | ||||
|  | ||||
| 	assert := assert.New(t) | ||||
|  | ||||
| 	logger, hook := NewNullLogger() | ||||
| 	assert.Nil(hook.LastEntry()) | ||||
| 	assert.Equal(0, len(hook.Entries)) | ||||
|  | ||||
| 	logger.Error("Hello error") | ||||
| 	assert.Equal(logrus.ErrorLevel, hook.LastEntry().Level) | ||||
| 	assert.Equal("Hello error", hook.LastEntry().Message) | ||||
| 	assert.Equal(1, len(hook.Entries)) | ||||
|  | ||||
| 	logger.Warn("Hello warning") | ||||
| 	assert.Equal(logrus.WarnLevel, hook.LastEntry().Level) | ||||
| 	assert.Equal("Hello warning", hook.LastEntry().Message) | ||||
| 	assert.Equal(2, len(hook.Entries)) | ||||
|  | ||||
| 	hook.Reset() | ||||
| 	assert.Nil(hook.LastEntry()) | ||||
| 	assert.Equal(0, len(hook.Entries)) | ||||
|  | ||||
| 	hook = NewGlobal() | ||||
|  | ||||
| 	logrus.Error("Hello error") | ||||
| 	assert.Equal(logrus.ErrorLevel, hook.LastEntry().Level) | ||||
| 	assert.Equal("Hello error", hook.LastEntry().Message) | ||||
| 	assert.Equal(1, len(hook.Entries)) | ||||
|  | ||||
| } | ||||
							
								
								
									
										199
									
								
								vendor/github.com/sirupsen/logrus/json_formatter_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										199
									
								
								vendor/github.com/sirupsen/logrus/json_formatter_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,199 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestErrorNotLost(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("error", errors.New("wild walrus"))) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	entry := make(map[string]interface{}) | ||||
| 	err = json.Unmarshal(b, &entry) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to unmarshal formatted entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if entry["error"] != "wild walrus" { | ||||
| 		t.Fatal("Error field not set") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestErrorNotLostOnFieldNotNamedError(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("omg", errors.New("wild walrus"))) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	entry := make(map[string]interface{}) | ||||
| 	err = json.Unmarshal(b, &entry) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to unmarshal formatted entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if entry["omg"] != "wild walrus" { | ||||
| 		t.Fatal("Error field not set") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestFieldClashWithTime(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("time", "right now!")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	entry := make(map[string]interface{}) | ||||
| 	err = json.Unmarshal(b, &entry) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to unmarshal formatted entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if entry["fields.time"] != "right now!" { | ||||
| 		t.Fatal("fields.time not set to original time field") | ||||
| 	} | ||||
|  | ||||
| 	if entry["time"] != "0001-01-01T00:00:00Z" { | ||||
| 		t.Fatal("time field not set to current time, was: ", entry["time"]) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestFieldClashWithMsg(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("msg", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	entry := make(map[string]interface{}) | ||||
| 	err = json.Unmarshal(b, &entry) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to unmarshal formatted entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if entry["fields.msg"] != "something" { | ||||
| 		t.Fatal("fields.msg not set to original msg field") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestFieldClashWithLevel(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	entry := make(map[string]interface{}) | ||||
| 	err = json.Unmarshal(b, &entry) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to unmarshal formatted entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if entry["fields.level"] != "something" { | ||||
| 		t.Fatal("fields.level not set to original level field") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONEntryEndsWithNewline(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
|  | ||||
| 	if b[len(b)-1] != '\n' { | ||||
| 		t.Fatal("Expected JSON log entry to end with a newline") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONMessageKey(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{ | ||||
| 		FieldMap: FieldMap{ | ||||
| 			FieldKeyMsg: "message", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	b, err := formatter.Format(&Entry{Message: "oh hai"}) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
| 	s := string(b) | ||||
| 	if !(strings.Contains(s, "message") && strings.Contains(s, "oh hai")) { | ||||
| 		t.Fatal("Expected JSON to format message key") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONLevelKey(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{ | ||||
| 		FieldMap: FieldMap{ | ||||
| 			FieldKeyLevel: "somelevel", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
| 	s := string(b) | ||||
| 	if !strings.Contains(s, "somelevel") { | ||||
| 		t.Fatal("Expected JSON to format level key") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONTimeKey(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{ | ||||
| 		FieldMap: FieldMap{ | ||||
| 			FieldKeyTime: "timeywimey", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
| 	s := string(b) | ||||
| 	if !strings.Contains(s, "timeywimey") { | ||||
| 		t.Fatal("Expected JSON to format time key") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONDisableTimestamp(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{ | ||||
| 		DisableTimestamp: true, | ||||
| 	} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
| 	s := string(b) | ||||
| 	if strings.Contains(s, FieldKeyTime) { | ||||
| 		t.Error("Did not prevent timestamp", s) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestJSONEnableTimestamp(t *testing.T) { | ||||
| 	formatter := &JSONFormatter{} | ||||
|  | ||||
| 	b, err := formatter.Format(WithField("level", "something")) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Unable to format entry: ", err) | ||||
| 	} | ||||
| 	s := string(b) | ||||
| 	if !strings.Contains(s, FieldKeyTime) { | ||||
| 		t.Error("Timestamp not present", s) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										61
									
								
								vendor/github.com/sirupsen/logrus/logger_bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/sirupsen/logrus/logger_bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,61 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| // smallFields is a small size data set for benchmarking | ||||
| var loggerFields = Fields{ | ||||
| 	"foo":   "bar", | ||||
| 	"baz":   "qux", | ||||
| 	"one":   "two", | ||||
| 	"three": "four", | ||||
| } | ||||
|  | ||||
| func BenchmarkDummyLogger(b *testing.B) { | ||||
| 	nullf, err := os.OpenFile("/dev/null", os.O_WRONLY, 0666) | ||||
| 	if err != nil { | ||||
| 		b.Fatalf("%v", err) | ||||
| 	} | ||||
| 	defer nullf.Close() | ||||
| 	doLoggerBenchmark(b, nullf, &TextFormatter{DisableColors: true}, smallFields) | ||||
| } | ||||
|  | ||||
| func BenchmarkDummyLoggerNoLock(b *testing.B) { | ||||
| 	nullf, err := os.OpenFile("/dev/null", os.O_WRONLY|os.O_APPEND, 0666) | ||||
| 	if err != nil { | ||||
| 		b.Fatalf("%v", err) | ||||
| 	} | ||||
| 	defer nullf.Close() | ||||
| 	doLoggerBenchmarkNoLock(b, nullf, &TextFormatter{DisableColors: true}, smallFields) | ||||
| } | ||||
|  | ||||
| func doLoggerBenchmark(b *testing.B, out *os.File, formatter Formatter, fields Fields) { | ||||
| 	logger := Logger{ | ||||
| 		Out:       out, | ||||
| 		Level:     InfoLevel, | ||||
| 		Formatter: formatter, | ||||
| 	} | ||||
| 	entry := logger.WithFields(fields) | ||||
| 	b.RunParallel(func(pb *testing.PB) { | ||||
| 		for pb.Next() { | ||||
| 			entry.Info("aaa") | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func doLoggerBenchmarkNoLock(b *testing.B, out *os.File, formatter Formatter, fields Fields) { | ||||
| 	logger := Logger{ | ||||
| 		Out:       out, | ||||
| 		Level:     InfoLevel, | ||||
| 		Formatter: formatter, | ||||
| 	} | ||||
| 	logger.SetNoLock() | ||||
| 	entry := logger.WithFields(fields) | ||||
| 	b.RunParallel(func(pb *testing.PB) { | ||||
| 		for pb.Next() { | ||||
| 			entry.Info("aaa") | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										386
									
								
								vendor/github.com/sirupsen/logrus/logrus_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										386
									
								
								vendor/github.com/sirupsen/logrus/logrus_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,386 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(fields Fields)) { | ||||
| 	var buffer bytes.Buffer | ||||
| 	var fields Fields | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &buffer | ||||
| 	logger.Formatter = new(JSONFormatter) | ||||
|  | ||||
| 	log(logger) | ||||
|  | ||||
| 	err := json.Unmarshal(buffer.Bytes(), &fields) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| 	assertions(fields) | ||||
| } | ||||
|  | ||||
| func LogAndAssertText(t *testing.T, log func(*Logger), assertions func(fields map[string]string)) { | ||||
| 	var buffer bytes.Buffer | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &buffer | ||||
| 	logger.Formatter = &TextFormatter{ | ||||
| 		DisableColors: true, | ||||
| 	} | ||||
|  | ||||
| 	log(logger) | ||||
|  | ||||
| 	fields := make(map[string]string) | ||||
| 	for _, kv := range strings.Split(buffer.String(), " ") { | ||||
| 		if !strings.Contains(kv, "=") { | ||||
| 			continue | ||||
| 		} | ||||
| 		kvArr := strings.Split(kv, "=") | ||||
| 		key := strings.TrimSpace(kvArr[0]) | ||||
| 		val := kvArr[1] | ||||
| 		if kvArr[1][0] == '"' { | ||||
| 			var err error | ||||
| 			val, err = strconv.Unquote(val) | ||||
| 			assert.NoError(t, err) | ||||
| 		} | ||||
| 		fields[key] = val | ||||
| 	} | ||||
| 	assertions(fields) | ||||
| } | ||||
|  | ||||
| func TestPrint(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Print("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test") | ||||
| 		assert.Equal(t, fields["level"], "info") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfo(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test") | ||||
| 		assert.Equal(t, fields["level"], "info") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestWarn(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Warn("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test") | ||||
| 		assert.Equal(t, fields["level"], "warning") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfolnShouldAddSpacesBetweenStrings(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Infoln("test", "test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test test") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfolnShouldAddSpacesBetweenStringAndNonstring(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Infoln("test", 10) | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test 10") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfolnShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Infoln(10, 10) | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "10 10") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfoShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Infoln(10, 10) | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "10 10") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfoShouldNotAddSpacesBetweenStringAndNonstring(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Info("test", 10) | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test10") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestInfoShouldNotAddSpacesBetweenStrings(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.Info("test", "test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "testtest") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestWithFieldsShouldAllowAssignments(t *testing.T) { | ||||
| 	var buffer bytes.Buffer | ||||
| 	var fields Fields | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &buffer | ||||
| 	logger.Formatter = new(JSONFormatter) | ||||
|  | ||||
| 	localLog := logger.WithFields(Fields{ | ||||
| 		"key1": "value1", | ||||
| 	}) | ||||
|  | ||||
| 	localLog.WithField("key2", "value2").Info("test") | ||||
| 	err := json.Unmarshal(buffer.Bytes(), &fields) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| 	assert.Equal(t, "value2", fields["key2"]) | ||||
| 	assert.Equal(t, "value1", fields["key1"]) | ||||
|  | ||||
| 	buffer = bytes.Buffer{} | ||||
| 	fields = Fields{} | ||||
| 	localLog.Info("test") | ||||
| 	err = json.Unmarshal(buffer.Bytes(), &fields) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| 	_, ok := fields["key2"] | ||||
| 	assert.Equal(t, false, ok) | ||||
| 	assert.Equal(t, "value1", fields["key1"]) | ||||
| } | ||||
|  | ||||
| func TestUserSuppliedFieldDoesNotOverwriteDefaults(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.WithField("msg", "hello").Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestUserSuppliedMsgFieldHasPrefix(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.WithField("msg", "hello").Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["msg"], "test") | ||||
| 		assert.Equal(t, fields["fields.msg"], "hello") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestUserSuppliedTimeFieldHasPrefix(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.WithField("time", "hello").Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["fields.time"], "hello") | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestUserSuppliedLevelFieldHasPrefix(t *testing.T) { | ||||
| 	LogAndAssertJSON(t, func(log *Logger) { | ||||
| 		log.WithField("level", 1).Info("test") | ||||
| 	}, func(fields Fields) { | ||||
| 		assert.Equal(t, fields["level"], "info") | ||||
| 		assert.Equal(t, fields["fields.level"], 1.0) // JSON has floats only | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestDefaultFieldsAreNotPrefixed(t *testing.T) { | ||||
| 	LogAndAssertText(t, func(log *Logger) { | ||||
| 		ll := log.WithField("herp", "derp") | ||||
| 		ll.Info("hello") | ||||
| 		ll.Info("bye") | ||||
| 	}, func(fields map[string]string) { | ||||
| 		for _, fieldName := range []string{"fields.level", "fields.time", "fields.msg"} { | ||||
| 			if _, ok := fields[fieldName]; ok { | ||||
| 				t.Fatalf("should not have prefixed %q: %v", fieldName, fields) | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestDoubleLoggingDoesntPrefixPreviousFields(t *testing.T) { | ||||
|  | ||||
| 	var buffer bytes.Buffer | ||||
| 	var fields Fields | ||||
|  | ||||
| 	logger := New() | ||||
| 	logger.Out = &buffer | ||||
| 	logger.Formatter = new(JSONFormatter) | ||||
|  | ||||
| 	llog := logger.WithField("context", "eating raw fish") | ||||
|  | ||||
| 	llog.Info("looks delicious") | ||||
|  | ||||
| 	err := json.Unmarshal(buffer.Bytes(), &fields) | ||||
| 	assert.NoError(t, err, "should have decoded first message") | ||||
| 	assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields") | ||||
| 	assert.Equal(t, fields["msg"], "looks delicious") | ||||
| 	assert.Equal(t, fields["context"], "eating raw fish") | ||||
|  | ||||
| 	buffer.Reset() | ||||
|  | ||||
| 	llog.Warn("omg it is!") | ||||
|  | ||||
| 	err = json.Unmarshal(buffer.Bytes(), &fields) | ||||
| 	assert.NoError(t, err, "should have decoded second message") | ||||
| 	assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields") | ||||
| 	assert.Equal(t, fields["msg"], "omg it is!") | ||||
| 	assert.Equal(t, fields["context"], "eating raw fish") | ||||
| 	assert.Nil(t, fields["fields.msg"], "should not have prefixed previous `msg` entry") | ||||
|  | ||||
| } | ||||
|  | ||||
| func TestConvertLevelToString(t *testing.T) { | ||||
| 	assert.Equal(t, "debug", DebugLevel.String()) | ||||
| 	assert.Equal(t, "info", InfoLevel.String()) | ||||
| 	assert.Equal(t, "warning", WarnLevel.String()) | ||||
| 	assert.Equal(t, "error", ErrorLevel.String()) | ||||
| 	assert.Equal(t, "fatal", FatalLevel.String()) | ||||
| 	assert.Equal(t, "panic", PanicLevel.String()) | ||||
| } | ||||
|  | ||||
| func TestParseLevel(t *testing.T) { | ||||
| 	l, err := ParseLevel("panic") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, PanicLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("PANIC") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, PanicLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("fatal") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, FatalLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("FATAL") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, FatalLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("error") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, ErrorLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("ERROR") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, ErrorLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("warn") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, WarnLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("WARN") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, WarnLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("warning") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, WarnLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("WARNING") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, WarnLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("info") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, InfoLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("INFO") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, InfoLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("debug") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, DebugLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("DEBUG") | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, DebugLevel, l) | ||||
|  | ||||
| 	l, err = ParseLevel("invalid") | ||||
| 	assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error()) | ||||
| } | ||||
|  | ||||
| func TestGetSetLevelRace(t *testing.T) { | ||||
| 	wg := sync.WaitGroup{} | ||||
| 	for i := 0; i < 100; i++ { | ||||
| 		wg.Add(1) | ||||
| 		go func(i int) { | ||||
| 			defer wg.Done() | ||||
| 			if i%2 == 0 { | ||||
| 				SetLevel(InfoLevel) | ||||
| 			} else { | ||||
| 				GetLevel() | ||||
| 			} | ||||
| 		}(i) | ||||
|  | ||||
| 	} | ||||
| 	wg.Wait() | ||||
| } | ||||
|  | ||||
| func TestLoggingRace(t *testing.T) { | ||||
| 	logger := New() | ||||
|  | ||||
| 	var wg sync.WaitGroup | ||||
| 	wg.Add(100) | ||||
|  | ||||
| 	for i := 0; i < 100; i++ { | ||||
| 		go func() { | ||||
| 			logger.Info("info") | ||||
| 			wg.Done() | ||||
| 		}() | ||||
| 	} | ||||
| 	wg.Wait() | ||||
| } | ||||
|  | ||||
| // Compile test | ||||
| func TestLogrusInterface(t *testing.T) { | ||||
| 	var buffer bytes.Buffer | ||||
| 	fn := func(l FieldLogger) { | ||||
| 		b := l.WithField("key", "value") | ||||
| 		b.Debug("Test") | ||||
| 	} | ||||
| 	// test logger | ||||
| 	logger := New() | ||||
| 	logger.Out = &buffer | ||||
| 	fn(logger) | ||||
|  | ||||
| 	// test Entry | ||||
| 	e := logger.WithField("another", "value") | ||||
| 	fn(e) | ||||
| } | ||||
|  | ||||
| // Implements io.Writer using channels for synchronization, so we can wait on | ||||
| // the Entry.Writer goroutine to write in a non-racey way. This does assume that | ||||
| // there is a single call to Logger.Out for each message. | ||||
| type channelWriter chan []byte | ||||
|  | ||||
| func (cw channelWriter) Write(p []byte) (int, error) { | ||||
| 	cw <- p | ||||
| 	return len(p), nil | ||||
| } | ||||
|  | ||||
| func TestEntryWriter(t *testing.T) { | ||||
| 	cw := channelWriter(make(chan []byte, 1)) | ||||
| 	log := New() | ||||
| 	log.Out = cw | ||||
| 	log.Formatter = new(JSONFormatter) | ||||
| 	log.WithField("foo", "bar").WriterLevel(WarnLevel).Write([]byte("hello\n")) | ||||
|  | ||||
| 	bs := <-cw | ||||
| 	var fields Fields | ||||
| 	err := json.Unmarshal(bs, &fields) | ||||
| 	assert.Nil(t, err) | ||||
| 	assert.Equal(t, fields["foo"], "bar") | ||||
| 	assert.Equal(t, fields["level"], "warning") | ||||
| } | ||||
							
								
								
									
										87
									
								
								vendor/github.com/sirupsen/logrus/text_formatter_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/github.com/sirupsen/logrus/text_formatter_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,87 +0,0 @@ | ||||
| package logrus | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func TestQuoting(t *testing.T) { | ||||
| 	tf := &TextFormatter{DisableColors: true} | ||||
|  | ||||
| 	checkQuoting := func(q bool, value interface{}) { | ||||
| 		b, _ := tf.Format(WithField("test", value)) | ||||
| 		idx := bytes.Index(b, ([]byte)("test=")) | ||||
| 		cont := bytes.Contains(b[idx+5:], []byte(tf.QuoteCharacter)) | ||||
| 		if cont != q { | ||||
| 			if q { | ||||
| 				t.Errorf("quoting expected for: %#v", value) | ||||
| 			} else { | ||||
| 				t.Errorf("quoting not expected for: %#v", value) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	checkQuoting(false, "") | ||||
| 	checkQuoting(false, "abcd") | ||||
| 	checkQuoting(false, "v1.0") | ||||
| 	checkQuoting(false, "1234567890") | ||||
| 	checkQuoting(true, "/foobar") | ||||
| 	checkQuoting(true, "x y") | ||||
| 	checkQuoting(true, "x,y") | ||||
| 	checkQuoting(false, errors.New("invalid")) | ||||
| 	checkQuoting(true, errors.New("invalid argument")) | ||||
|  | ||||
| 	// Test for custom quote character. | ||||
| 	tf.QuoteCharacter = "`" | ||||
| 	checkQuoting(false, "") | ||||
| 	checkQuoting(false, "abcd") | ||||
| 	checkQuoting(true, "/foobar") | ||||
| 	checkQuoting(true, errors.New("invalid argument")) | ||||
|  | ||||
| 	// Test for multi-character quotes. | ||||
| 	tf.QuoteCharacter = "§~±" | ||||
| 	checkQuoting(false, "abcd") | ||||
| 	checkQuoting(true, errors.New("invalid argument")) | ||||
|  | ||||
| 	// Test for quoting empty fields. | ||||
| 	tf.QuoteEmptyFields = true | ||||
| 	checkQuoting(true, "") | ||||
| 	checkQuoting(false, "abcd") | ||||
| 	checkQuoting(true, errors.New("invalid argument")) | ||||
| } | ||||
|  | ||||
| func TestTimestampFormat(t *testing.T) { | ||||
| 	checkTimeStr := func(format string) { | ||||
| 		customFormatter := &TextFormatter{DisableColors: true, TimestampFormat: format} | ||||
| 		customStr, _ := customFormatter.Format(WithField("test", "test")) | ||||
| 		timeStart := bytes.Index(customStr, ([]byte)("time=")) | ||||
| 		timeEnd := bytes.Index(customStr, ([]byte)("level=")) | ||||
| 		timeStr := customStr[timeStart+5+len(customFormatter.QuoteCharacter) : timeEnd-1-len(customFormatter.QuoteCharacter)] | ||||
| 		if format == "" { | ||||
| 			format = time.RFC3339 | ||||
| 		} | ||||
| 		_, e := time.Parse(format, (string)(timeStr)) | ||||
| 		if e != nil { | ||||
| 			t.Errorf("time string \"%s\" did not match provided time format \"%s\": %s", timeStr, format, e) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	checkTimeStr("2006-01-02T15:04:05.000000000Z07:00") | ||||
| 	checkTimeStr("Mon Jan _2 15:04:05 2006") | ||||
| 	checkTimeStr("") | ||||
| } | ||||
|  | ||||
| func TestDisableTimestampWithColoredOutput(t *testing.T) { | ||||
| 	tf := &TextFormatter{DisableTimestamp: true, ForceColors: true} | ||||
|  | ||||
| 	b, _ := tf.Format(WithField("test", "test")) | ||||
| 	if strings.Contains(string(b), "[0000]") { | ||||
| 		t.Error("timestamp not expected when DisableTimestamp is true") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // TODO add tests for sorting etc., this requires a parser for the text | ||||
| // formatter output. | ||||
		Reference in New Issue
	
	Block a user
	 Derek McGowan
					Derek McGowan