Switch from glide to govendor
This commit is contained in:
21
vendor/github.com/go-kit/kit/log/benchmark_test.go
generated
vendored
21
vendor/github.com/go-kit/kit/log/benchmark_test.go
generated
vendored
@@ -1,21 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func benchmarkRunner(b *testing.B, logger log.Logger, f func(log.Logger)) {
|
||||
lc := log.NewContext(logger).With("common_key", "common_value")
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
f(lc)
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
baseMessage = func(logger log.Logger) { logger.Log("foo_key", "foo_value") }
|
||||
withMessage = func(logger log.Logger) { log.NewContext(logger).With("a", "b").Log("c", "d") }
|
||||
)
|
40
vendor/github.com/go-kit/kit/log/concurrency_test.go
generated
vendored
40
vendor/github.com/go-kit/kit/log/concurrency_test.go
generated
vendored
@@ -1,40 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"math"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
// These test are designed to be run with the race detector.
|
||||
|
||||
func testConcurrency(t *testing.T, logger log.Logger, total int) {
|
||||
n := int(math.Sqrt(float64(total)))
|
||||
share := total / n
|
||||
|
||||
errC := make(chan error, n)
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
go func() {
|
||||
errC <- spam(logger, share)
|
||||
}()
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
err := <-errC
|
||||
if err != nil {
|
||||
t.Fatalf("concurrent logging error: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func spam(logger log.Logger, count int) error {
|
||||
for i := 0; i < count; i++ {
|
||||
err := logger.Log("key", i)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
102
vendor/github.com/go-kit/kit/log/example_test.go
generated
vendored
102
vendor/github.com/go-kit/kit/log/example_test.go
generated
vendored
@@ -1,102 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func Example_basic() {
|
||||
logger := log.NewLogfmtLogger(os.Stdout)
|
||||
|
||||
type Task struct {
|
||||
ID int
|
||||
}
|
||||
|
||||
RunTask := func(task Task, logger log.Logger) {
|
||||
logger.Log("taskID", task.ID, "event", "starting task")
|
||||
|
||||
logger.Log("taskID", task.ID, "event", "task complete")
|
||||
}
|
||||
|
||||
RunTask(Task{ID: 1}, logger)
|
||||
|
||||
// Output:
|
||||
// taskID=1 event="starting task"
|
||||
// taskID=1 event="task complete"
|
||||
}
|
||||
|
||||
func Example_context() {
|
||||
logger := log.NewLogfmtLogger(os.Stdout)
|
||||
|
||||
type Task struct {
|
||||
ID int
|
||||
Cmd string
|
||||
}
|
||||
|
||||
taskHelper := func(cmd string, logger log.Logger) {
|
||||
// execute(cmd)
|
||||
logger.Log("cmd", cmd, "dur", 42*time.Millisecond)
|
||||
}
|
||||
|
||||
RunTask := func(task Task, logger log.Logger) {
|
||||
logger = log.NewContext(logger).With("taskID", task.ID)
|
||||
logger.Log("event", "starting task")
|
||||
|
||||
taskHelper(task.Cmd, logger)
|
||||
|
||||
logger.Log("event", "task complete")
|
||||
}
|
||||
|
||||
RunTask(Task{ID: 1, Cmd: "echo Hello, world!"}, logger)
|
||||
|
||||
// Output:
|
||||
// taskID=1 event="starting task"
|
||||
// taskID=1 cmd="echo Hello, world!" dur=42ms
|
||||
// taskID=1 event="task complete"
|
||||
}
|
||||
|
||||
func Example_valuer() {
|
||||
logger := log.NewLogfmtLogger(os.Stdout)
|
||||
|
||||
count := 0
|
||||
counter := func() interface{} {
|
||||
count++
|
||||
return count
|
||||
}
|
||||
|
||||
logger = log.NewContext(logger).With("count", log.Valuer(counter))
|
||||
|
||||
logger.Log("call", "first")
|
||||
logger.Log("call", "second")
|
||||
|
||||
// Output:
|
||||
// count=1 call=first
|
||||
// count=2 call=second
|
||||
}
|
||||
|
||||
func Example_debugInfo() {
|
||||
logger := log.NewLogfmtLogger(os.Stdout)
|
||||
|
||||
// make time predictable for this test
|
||||
baseTime := time.Date(2015, time.February, 3, 10, 0, 0, 0, time.UTC)
|
||||
mockTime := func() time.Time {
|
||||
baseTime = baseTime.Add(time.Second)
|
||||
return baseTime
|
||||
}
|
||||
|
||||
logger = log.NewContext(logger).With("time", log.Timestamp(mockTime), "caller", log.DefaultCaller)
|
||||
|
||||
logger.Log("call", "first")
|
||||
logger.Log("call", "second")
|
||||
|
||||
// ...
|
||||
|
||||
logger.Log("call", "third")
|
||||
|
||||
// Output:
|
||||
// time=2015-02-03T10:00:01Z caller=example_test.go:91 call=first
|
||||
// time=2015-02-03T10:00:02Z caller=example_test.go:92 call=second
|
||||
// time=2015-02-03T10:00:03Z caller=example_test.go:96 call=third
|
||||
}
|
65
vendor/github.com/go-kit/kit/log/experimental_level/benchmark_test.go
generated
vendored
65
vendor/github.com/go-kit/kit/log/experimental_level/benchmark_test.go
generated
vendored
@@ -1,65 +0,0 @@
|
||||
package level_test
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/log/experimental_level"
|
||||
)
|
||||
|
||||
func BenchmarkNopBaseline(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewNopLogger())
|
||||
}
|
||||
|
||||
func BenchmarkNopDisallowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewNopLogger(), level.Config{
|
||||
Allowed: level.AllowInfoAndAbove(),
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkNopAllowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewNopLogger(), level.Config{
|
||||
Allowed: level.AllowAll(),
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkJSONBaseline(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard))
|
||||
}
|
||||
|
||||
func BenchmarkJSONDisallowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewJSONLogger(ioutil.Discard), level.Config{
|
||||
Allowed: level.AllowInfoAndAbove(),
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkJSONAllowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewJSONLogger(ioutil.Discard), level.Config{
|
||||
Allowed: level.AllowAll(),
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkLogfmtBaseline(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewLogfmtLogger(ioutil.Discard))
|
||||
}
|
||||
|
||||
func BenchmarkLogfmtDisallowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewLogfmtLogger(ioutil.Discard), level.Config{
|
||||
Allowed: level.AllowInfoAndAbove(),
|
||||
}))
|
||||
}
|
||||
|
||||
func BenchmarkLogfmtAllowedLevel(b *testing.B) {
|
||||
benchmarkRunner(b, level.New(log.NewLogfmtLogger(ioutil.Discard), level.Config{
|
||||
Allowed: level.AllowAll(),
|
||||
}))
|
||||
}
|
||||
|
||||
func benchmarkRunner(b *testing.B, logger log.Logger) {
|
||||
b.ResetTimer()
|
||||
b.ReportAllocs()
|
||||
for i := 0; i < b.N; i++ {
|
||||
level.Debug(logger).Log("foo", "bar")
|
||||
}
|
||||
}
|
27
vendor/github.com/go-kit/kit/log/experimental_level/doc.go
generated
vendored
27
vendor/github.com/go-kit/kit/log/experimental_level/doc.go
generated
vendored
@@ -1,27 +0,0 @@
|
||||
// Package level is an EXPERIMENTAL levelled logging package. The API will
|
||||
// definitely have breaking changes and may be deleted altogether. Be warned!
|
||||
//
|
||||
// To use the level package, create a logger as per normal in your func main,
|
||||
// and wrap it with level.New.
|
||||
//
|
||||
// var logger log.Logger
|
||||
// logger = log.NewLogfmtLogger(os.Stderr)
|
||||
// logger = level.New(logger, level.Config{Allowed: level.AllowInfoAndAbove}) // <--
|
||||
// logger = log.NewContext(logger).With("ts", log.DefaultTimestampUTC)
|
||||
//
|
||||
// Then, at the callsites, use one of the level.Debug, Info, Warn, or Error
|
||||
// helper methods to emit leveled log events.
|
||||
//
|
||||
// logger.Log("foo", "bar") // as normal, no level
|
||||
// level.Debug(logger).Log("request_id", reqID, "trace_data", trace.Get())
|
||||
// if value > 100 {
|
||||
// level.Error(logger).Log("value", value)
|
||||
// }
|
||||
//
|
||||
// The leveled logger allows precise control over what should happen if a log
|
||||
// event is emitted without a level key, or if a squelched level is used. Check
|
||||
// the Config struct for details. And, you can easily use non-default level
|
||||
// values: create new string constants for whatever you want to change, pass
|
||||
// them explicitly to the Config struct, and write your own level.Foo-style
|
||||
// helper methods.
|
||||
package level
|
146
vendor/github.com/go-kit/kit/log/experimental_level/level.go
generated
vendored
146
vendor/github.com/go-kit/kit/log/experimental_level/level.go
generated
vendored
@@ -1,146 +0,0 @@
|
||||
package level
|
||||
|
||||
import (
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
var (
|
||||
levelKey = "level"
|
||||
errorLevelValue = "error"
|
||||
warnLevelValue = "warn"
|
||||
infoLevelValue = "info"
|
||||
debugLevelValue = "debug"
|
||||
)
|
||||
|
||||
// AllowAll is an alias for AllowDebugAndAbove.
|
||||
func AllowAll() []string {
|
||||
return AllowDebugAndAbove()
|
||||
}
|
||||
|
||||
// AllowDebugAndAbove allows all of the four default log levels.
|
||||
// Its return value may be provided as the Allowed parameter in the Config.
|
||||
func AllowDebugAndAbove() []string {
|
||||
return []string{errorLevelValue, warnLevelValue, infoLevelValue, debugLevelValue}
|
||||
}
|
||||
|
||||
// AllowInfoAndAbove allows the default info, warn, and error log levels.
|
||||
// Its return value may be provided as the Allowed parameter in the Config.
|
||||
func AllowInfoAndAbove() []string {
|
||||
return []string{errorLevelValue, warnLevelValue, infoLevelValue}
|
||||
}
|
||||
|
||||
// AllowWarnAndAbove allows the default warn and error log levels.
|
||||
// Its return value may be provided as the Allowed parameter in the Config.
|
||||
func AllowWarnAndAbove() []string {
|
||||
return []string{errorLevelValue, warnLevelValue}
|
||||
}
|
||||
|
||||
// AllowErrorOnly allows only the default error log level.
|
||||
// Its return value may be provided as the Allowed parameter in the Config.
|
||||
func AllowErrorOnly() []string {
|
||||
return []string{errorLevelValue}
|
||||
}
|
||||
|
||||
// AllowNone allows none of the default log levels.
|
||||
// Its return value may be provided as the Allowed parameter in the Config.
|
||||
func AllowNone() []string {
|
||||
return []string{}
|
||||
}
|
||||
|
||||
// Error returns a logger with the level key set to ErrorLevelValue.
|
||||
func Error(logger log.Logger) log.Logger {
|
||||
return log.NewContext(logger).With(levelKey, errorLevelValue)
|
||||
}
|
||||
|
||||
// Warn returns a logger with the level key set to WarnLevelValue.
|
||||
func Warn(logger log.Logger) log.Logger {
|
||||
return log.NewContext(logger).With(levelKey, warnLevelValue)
|
||||
}
|
||||
|
||||
// Info returns a logger with the level key set to InfoLevelValue.
|
||||
func Info(logger log.Logger) log.Logger {
|
||||
return log.NewContext(logger).With(levelKey, infoLevelValue)
|
||||
}
|
||||
|
||||
// Debug returns a logger with the level key set to DebugLevelValue.
|
||||
func Debug(logger log.Logger) log.Logger {
|
||||
return log.NewContext(logger).With(levelKey, debugLevelValue)
|
||||
}
|
||||
|
||||
// Config parameterizes the leveled logger.
|
||||
type Config struct {
|
||||
// Allowed enumerates the accepted log levels. If a log event is encountered
|
||||
// with a level key set to a value that isn't explicitly allowed, the event
|
||||
// will be squelched, and ErrNotAllowed returned.
|
||||
Allowed []string
|
||||
|
||||
// ErrNotAllowed is returned to the caller when Log is invoked with a level
|
||||
// key that hasn't been explicitly allowed. By default, ErrNotAllowed is
|
||||
// nil; in this case, the log event is squelched with no error.
|
||||
ErrNotAllowed error
|
||||
|
||||
// SquelchNoLevel will squelch log events with no level key, so that they
|
||||
// don't proceed through to the wrapped logger. If SquelchNoLevel is set to
|
||||
// true and a log event is squelched in this way, ErrNoLevel is returned to
|
||||
// the caller.
|
||||
SquelchNoLevel bool
|
||||
|
||||
// ErrNoLevel is returned to the caller when SquelchNoLevel is true, and Log
|
||||
// is invoked without a level key. By default, ErrNoLevel is nil; in this
|
||||
// case, the log event is squelched with no error.
|
||||
ErrNoLevel error
|
||||
}
|
||||
|
||||
// New wraps the logger and implements level checking. See the commentary on the
|
||||
// Config object for a detailed description of how to configure levels.
|
||||
func New(next log.Logger, config Config) log.Logger {
|
||||
return &logger{
|
||||
next: next,
|
||||
allowed: makeSet(config.Allowed),
|
||||
errNotAllowed: config.ErrNotAllowed,
|
||||
squelchNoLevel: config.SquelchNoLevel,
|
||||
errNoLevel: config.ErrNoLevel,
|
||||
}
|
||||
}
|
||||
|
||||
type logger struct {
|
||||
next log.Logger
|
||||
allowed map[string]struct{}
|
||||
errNotAllowed error
|
||||
squelchNoLevel bool
|
||||
errNoLevel error
|
||||
}
|
||||
|
||||
func (l *logger) Log(keyvals ...interface{}) error {
|
||||
var hasLevel, levelAllowed bool
|
||||
for i := 0; i < len(keyvals); i += 2 {
|
||||
if k, ok := keyvals[i].(string); !ok || k != levelKey {
|
||||
continue
|
||||
}
|
||||
hasLevel = true
|
||||
if i >= len(keyvals) {
|
||||
continue
|
||||
}
|
||||
v, ok := keyvals[i+1].(string)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
_, levelAllowed = l.allowed[v]
|
||||
break
|
||||
}
|
||||
if !hasLevel && l.squelchNoLevel {
|
||||
return l.errNoLevel
|
||||
}
|
||||
if hasLevel && !levelAllowed {
|
||||
return l.errNotAllowed
|
||||
}
|
||||
return l.next.Log(keyvals...)
|
||||
}
|
||||
|
||||
func makeSet(a []string) map[string]struct{} {
|
||||
m := make(map[string]struct{}, len(a))
|
||||
for _, s := range a {
|
||||
m[s] = struct{}{}
|
||||
}
|
||||
return m
|
||||
}
|
154
vendor/github.com/go-kit/kit/log/experimental_level/level_test.go
generated
vendored
154
vendor/github.com/go-kit/kit/log/experimental_level/level_test.go
generated
vendored
@@ -1,154 +0,0 @@
|
||||
package level_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/log/experimental_level"
|
||||
)
|
||||
|
||||
func TestVariousLevels(t *testing.T) {
|
||||
for _, testcase := range []struct {
|
||||
allowed []string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
level.AllowAll(),
|
||||
strings.Join([]string{
|
||||
`{"level":"debug","this is":"debug log"}`,
|
||||
`{"level":"info","this is":"info log"}`,
|
||||
`{"level":"warn","this is":"warn log"}`,
|
||||
`{"level":"error","this is":"error log"}`,
|
||||
}, "\n"),
|
||||
},
|
||||
{
|
||||
level.AllowDebugAndAbove(),
|
||||
strings.Join([]string{
|
||||
`{"level":"debug","this is":"debug log"}`,
|
||||
`{"level":"info","this is":"info log"}`,
|
||||
`{"level":"warn","this is":"warn log"}`,
|
||||
`{"level":"error","this is":"error log"}`,
|
||||
}, "\n"),
|
||||
},
|
||||
{
|
||||
level.AllowInfoAndAbove(),
|
||||
strings.Join([]string{
|
||||
`{"level":"info","this is":"info log"}`,
|
||||
`{"level":"warn","this is":"warn log"}`,
|
||||
`{"level":"error","this is":"error log"}`,
|
||||
}, "\n"),
|
||||
},
|
||||
{
|
||||
level.AllowWarnAndAbove(),
|
||||
strings.Join([]string{
|
||||
`{"level":"warn","this is":"warn log"}`,
|
||||
`{"level":"error","this is":"error log"}`,
|
||||
}, "\n"),
|
||||
},
|
||||
{
|
||||
level.AllowErrorOnly(),
|
||||
strings.Join([]string{
|
||||
`{"level":"error","this is":"error log"}`,
|
||||
}, "\n"),
|
||||
},
|
||||
{
|
||||
level.AllowNone(),
|
||||
``,
|
||||
},
|
||||
} {
|
||||
var buf bytes.Buffer
|
||||
logger := level.New(log.NewJSONLogger(&buf), level.Config{Allowed: testcase.allowed})
|
||||
|
||||
level.Debug(logger).Log("this is", "debug log")
|
||||
level.Info(logger).Log("this is", "info log")
|
||||
level.Warn(logger).Log("this is", "warn log")
|
||||
level.Error(logger).Log("this is", "error log")
|
||||
|
||||
if want, have := testcase.want, strings.TrimSpace(buf.String()); want != have {
|
||||
t.Errorf("given Allowed=%v: want\n%s\nhave\n%s", testcase.allowed, want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestErrNotAllowed(t *testing.T) {
|
||||
myError := errors.New("squelched!")
|
||||
logger := level.New(log.NewNopLogger(), level.Config{
|
||||
Allowed: level.AllowWarnAndAbove(),
|
||||
ErrNotAllowed: myError,
|
||||
})
|
||||
|
||||
if want, have := myError, level.Info(logger).Log("foo", "bar"); want != have {
|
||||
t.Errorf("want %#+v, have %#+v", want, have)
|
||||
}
|
||||
|
||||
if want, have := error(nil), level.Warn(logger).Log("foo", "bar"); want != have {
|
||||
t.Errorf("want %#+v, have %#+v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestErrNoLevel(t *testing.T) {
|
||||
myError := errors.New("no level specified")
|
||||
|
||||
var buf bytes.Buffer
|
||||
logger := level.New(log.NewJSONLogger(&buf), level.Config{
|
||||
SquelchNoLevel: true,
|
||||
ErrNoLevel: myError,
|
||||
})
|
||||
|
||||
if want, have := myError, logger.Log("foo", "bar"); want != have {
|
||||
t.Errorf("want %v, have %v", want, have)
|
||||
}
|
||||
if want, have := ``, strings.TrimSpace(buf.String()); want != have {
|
||||
t.Errorf("want %q, have %q", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllowNoLevel(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
logger := level.New(log.NewJSONLogger(&buf), level.Config{
|
||||
SquelchNoLevel: false,
|
||||
ErrNoLevel: errors.New("I should never be returned!"),
|
||||
})
|
||||
|
||||
if want, have := error(nil), logger.Log("foo", "bar"); want != have {
|
||||
t.Errorf("want %v, have %v", want, have)
|
||||
}
|
||||
if want, have := `{"foo":"bar"}`, strings.TrimSpace(buf.String()); want != have {
|
||||
t.Errorf("want %q, have %q", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLevelContext(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
|
||||
// Wrapping the level logger with a context allows users to use
|
||||
// log.DefaultCaller as per normal.
|
||||
var logger log.Logger
|
||||
logger = log.NewLogfmtLogger(&buf)
|
||||
logger = level.New(logger, level.Config{Allowed: level.AllowAll()})
|
||||
logger = log.NewContext(logger).With("caller", log.DefaultCaller)
|
||||
|
||||
level.Info(logger).Log("foo", "bar")
|
||||
if want, have := `caller=level_test.go:134 level=info foo=bar`, strings.TrimSpace(buf.String()); want != have {
|
||||
t.Errorf("want %q, have %q", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestContextLevel(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
|
||||
// Wrapping a context with the level logger still works, but requires users
|
||||
// to specify a higher callstack depth value.
|
||||
var logger log.Logger
|
||||
logger = log.NewLogfmtLogger(&buf)
|
||||
logger = log.NewContext(logger).With("caller", log.Caller(5))
|
||||
logger = level.New(logger, level.Config{Allowed: level.AllowAll()})
|
||||
|
||||
level.Info(logger).Log("foo", "bar")
|
||||
if want, have := `caller=level_test.go:150 level=info foo=bar`, strings.TrimSpace(buf.String()); want != have {
|
||||
t.Errorf("want %q, have %q", want, have)
|
||||
}
|
||||
}
|
158
vendor/github.com/go-kit/kit/log/json_logger_test.go
generated
vendored
158
vendor/github.com/go-kit/kit/log/json_logger_test.go
generated
vendored
@@ -1,158 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func TestJSONLoggerCaller(t *testing.T) {
|
||||
t.Parallel()
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
logger = log.NewContext(logger).With("caller", log.DefaultCaller)
|
||||
|
||||
if err := logger.Log(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := `{"caller":"json_logger_test.go:18"}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJSONLogger(t *testing.T) {
|
||||
t.Parallel()
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
if err := logger.Log("err", errors.New("err"), "m", map[string]int{"0": 0}, "a", []int{1, 2, 3}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := `{"a":[1,2,3],"err":"err","m":{"0":0}}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJSONLoggerMissingValue(t *testing.T) {
|
||||
t.Parallel()
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
if err := logger.Log("k"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := `{"k":"(MISSING)"}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJSONLoggerNilStringerKey(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
if err := logger.Log((*stringer)(nil), "v"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := `{"NULL":"v"}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJSONLoggerNilErrorValue(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
if err := logger.Log("err", (*stringError)(nil)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := `{"err":null}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
// aller implements json.Marshaler, encoding.TextMarshaler, and fmt.Stringer.
|
||||
type aller struct{}
|
||||
|
||||
func (aller) MarshalJSON() ([]byte, error) {
|
||||
return []byte("\"json\""), nil
|
||||
}
|
||||
|
||||
func (aller) MarshalText() ([]byte, error) {
|
||||
return []byte("text"), nil
|
||||
}
|
||||
|
||||
func (aller) String() string {
|
||||
return "string"
|
||||
}
|
||||
|
||||
// textstringer implements encoding.TextMarshaler and fmt.Stringer.
|
||||
type textstringer struct{}
|
||||
|
||||
func (textstringer) MarshalText() ([]byte, error) {
|
||||
return []byte("text"), nil
|
||||
}
|
||||
|
||||
func (textstringer) String() string {
|
||||
return "string"
|
||||
}
|
||||
|
||||
func TestJSONLoggerStringValue(t *testing.T) {
|
||||
t.Parallel()
|
||||
tests := []struct {
|
||||
v interface{}
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
v: aller{},
|
||||
expected: `{"v":"json"}`,
|
||||
},
|
||||
{
|
||||
v: textstringer{},
|
||||
expected: `{"v":"text"}`,
|
||||
},
|
||||
{
|
||||
v: stringer("string"),
|
||||
expected: `{"v":"string"}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewJSONLogger(buf)
|
||||
if err := logger.Log("v", test.v); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if want, have := test.expected+"\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type stringer string
|
||||
|
||||
func (s stringer) String() string {
|
||||
return string(s)
|
||||
}
|
||||
|
||||
type stringError string
|
||||
|
||||
func (s stringError) Error() string {
|
||||
return string(s)
|
||||
}
|
||||
|
||||
func BenchmarkJSONLoggerSimple(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard), baseMessage)
|
||||
}
|
||||
|
||||
func BenchmarkJSONLoggerContextual(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard), withMessage)
|
||||
}
|
||||
|
||||
func TestJSONLoggerConcurrency(t *testing.T) {
|
||||
t.Parallel()
|
||||
testConcurrency(t, log.NewJSONLogger(ioutil.Discard), 10000)
|
||||
}
|
127
vendor/github.com/go-kit/kit/log/levels/levels.go
generated
vendored
127
vendor/github.com/go-kit/kit/log/levels/levels.go
generated
vendored
@@ -1,127 +0,0 @@
|
||||
package levels
|
||||
|
||||
import "github.com/go-kit/kit/log"
|
||||
|
||||
// Levels provides a leveled logging wrapper around a logger. It has five
|
||||
// levels: debug, info, warning (warn), error, and critical (crit). If you
|
||||
// want a different set of levels, you can create your own levels type very
|
||||
// easily, and you can elide the configuration.
|
||||
type Levels struct {
|
||||
ctx *log.Context
|
||||
levelKey string
|
||||
|
||||
// We have a choice between storing level values in string fields or
|
||||
// making a separate context for each level. When using string fields the
|
||||
// Log method must combine the base context, the level data, and the
|
||||
// logged keyvals; but the With method only requires updating one context.
|
||||
// If we instead keep a separate context for each level the Log method
|
||||
// must only append the new keyvals; but the With method would have to
|
||||
// update all five contexts.
|
||||
|
||||
// Roughly speaking, storing multiple contexts breaks even if the ratio of
|
||||
// Log/With calls is more than the number of levels. We have chosen to
|
||||
// make the With method cheap and the Log method a bit more costly because
|
||||
// we do not expect most applications to Log more than five times for each
|
||||
// call to With.
|
||||
|
||||
debugValue string
|
||||
infoValue string
|
||||
warnValue string
|
||||
errorValue string
|
||||
critValue string
|
||||
}
|
||||
|
||||
// New creates a new leveled logger, wrapping the passed logger.
|
||||
func New(logger log.Logger, options ...Option) Levels {
|
||||
l := Levels{
|
||||
ctx: log.NewContext(logger),
|
||||
levelKey: "level",
|
||||
|
||||
debugValue: "debug",
|
||||
infoValue: "info",
|
||||
warnValue: "warn",
|
||||
errorValue: "error",
|
||||
critValue: "crit",
|
||||
}
|
||||
for _, option := range options {
|
||||
option(&l)
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
||||
// With returns a new leveled logger that includes keyvals in all log events.
|
||||
func (l Levels) With(keyvals ...interface{}) Levels {
|
||||
return Levels{
|
||||
ctx: l.ctx.With(keyvals...),
|
||||
levelKey: l.levelKey,
|
||||
debugValue: l.debugValue,
|
||||
infoValue: l.infoValue,
|
||||
warnValue: l.warnValue,
|
||||
errorValue: l.errorValue,
|
||||
critValue: l.critValue,
|
||||
}
|
||||
}
|
||||
|
||||
// Debug returns a debug level logger.
|
||||
func (l Levels) Debug() log.Logger {
|
||||
return l.ctx.WithPrefix(l.levelKey, l.debugValue)
|
||||
}
|
||||
|
||||
// Info returns an info level logger.
|
||||
func (l Levels) Info() log.Logger {
|
||||
return l.ctx.WithPrefix(l.levelKey, l.infoValue)
|
||||
}
|
||||
|
||||
// Warn returns a warning level logger.
|
||||
func (l Levels) Warn() log.Logger {
|
||||
return l.ctx.WithPrefix(l.levelKey, l.warnValue)
|
||||
}
|
||||
|
||||
// Error returns an error level logger.
|
||||
func (l Levels) Error() log.Logger {
|
||||
return l.ctx.WithPrefix(l.levelKey, l.errorValue)
|
||||
}
|
||||
|
||||
// Crit returns a critical level logger.
|
||||
func (l Levels) Crit() log.Logger {
|
||||
return l.ctx.WithPrefix(l.levelKey, l.critValue)
|
||||
}
|
||||
|
||||
// Option sets a parameter for leveled loggers.
|
||||
type Option func(*Levels)
|
||||
|
||||
// Key sets the key for the field used to indicate log level. By default,
|
||||
// the key is "level".
|
||||
func Key(key string) Option {
|
||||
return func(l *Levels) { l.levelKey = key }
|
||||
}
|
||||
|
||||
// DebugValue sets the value for the field used to indicate the debug log
|
||||
// level. By default, the value is "debug".
|
||||
func DebugValue(value string) Option {
|
||||
return func(l *Levels) { l.debugValue = value }
|
||||
}
|
||||
|
||||
// InfoValue sets the value for the field used to indicate the info log level.
|
||||
// By default, the value is "info".
|
||||
func InfoValue(value string) Option {
|
||||
return func(l *Levels) { l.infoValue = value }
|
||||
}
|
||||
|
||||
// WarnValue sets the value for the field used to indicate the warning log
|
||||
// level. By default, the value is "warn".
|
||||
func WarnValue(value string) Option {
|
||||
return func(l *Levels) { l.warnValue = value }
|
||||
}
|
||||
|
||||
// ErrorValue sets the value for the field used to indicate the error log
|
||||
// level. By default, the value is "error".
|
||||
func ErrorValue(value string) Option {
|
||||
return func(l *Levels) { l.errorValue = value }
|
||||
}
|
||||
|
||||
// CritValue sets the value for the field used to indicate the critical log
|
||||
// level. By default, the value is "crit".
|
||||
func CritValue(value string) Option {
|
||||
return func(l *Levels) { l.critValue = value }
|
||||
}
|
65
vendor/github.com/go-kit/kit/log/levels/levels_test.go
generated
vendored
65
vendor/github.com/go-kit/kit/log/levels/levels_test.go
generated
vendored
@@ -1,65 +0,0 @@
|
||||
package levels_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/log/levels"
|
||||
)
|
||||
|
||||
func TestDefaultLevels(t *testing.T) {
|
||||
buf := bytes.Buffer{}
|
||||
logger := levels.New(log.NewLogfmtLogger(&buf))
|
||||
|
||||
logger.Debug().Log("msg", "résumé") // of course you'd want to do this
|
||||
if want, have := "level=debug msg=résumé\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Info().Log("msg", "Åhus")
|
||||
if want, have := "level=info msg=Åhus\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Error().Log("msg", "© violation")
|
||||
if want, have := "level=error msg=\"© violation\"\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Crit().Log("msg", " ")
|
||||
if want, have := "level=crit msg=\"\\t\"\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestModifiedLevels(t *testing.T) {
|
||||
buf := bytes.Buffer{}
|
||||
logger := levels.New(
|
||||
log.NewJSONLogger(&buf),
|
||||
levels.Key("l"),
|
||||
levels.DebugValue("dbg"),
|
||||
levels.InfoValue("nfo"),
|
||||
levels.WarnValue("wrn"),
|
||||
levels.ErrorValue("err"),
|
||||
levels.CritValue("crt"),
|
||||
)
|
||||
logger.With("easter_island", "176°").Debug().Log("msg", "moai")
|
||||
if want, have := `{"easter_island":"176°","l":"dbg","msg":"moai"}`+"\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func ExampleLevels() {
|
||||
logger := levels.New(log.NewLogfmtLogger(os.Stdout))
|
||||
logger.Debug().Log("msg", "hello")
|
||||
logger.With("context", "foo").Warn().Log("err", "error")
|
||||
|
||||
// Output:
|
||||
// level=debug msg=hello
|
||||
// level=warn context=foo err=error
|
||||
}
|
210
vendor/github.com/go-kit/kit/log/log_test.go
generated
vendored
210
vendor/github.com/go-kit/kit/log/log_test.go
generated
vendored
@@ -1,210 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-stack/stack"
|
||||
)
|
||||
|
||||
func TestContext(t *testing.T) {
|
||||
t.Parallel()
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewLogfmtLogger(buf)
|
||||
|
||||
kvs := []interface{}{"a", 123}
|
||||
lc := log.NewContext(logger).With(kvs...)
|
||||
kvs[1] = 0 // With should copy its key values
|
||||
|
||||
lc = lc.With("b", "c") // With should stack
|
||||
if err := lc.Log("msg", "message"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "a=123 b=c msg=message\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant: %shave: %s", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
lc = lc.WithPrefix("p", "first")
|
||||
if err := lc.Log("msg", "message"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "p=first a=123 b=c msg=message\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant: %shave: %s", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestContextMissingValue(t *testing.T) {
|
||||
t.Parallel()
|
||||
var output []interface{}
|
||||
logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error {
|
||||
output = keyvals
|
||||
return nil
|
||||
}))
|
||||
|
||||
lc := log.NewContext(logger)
|
||||
|
||||
lc.Log("k")
|
||||
if want, have := 2, len(output); want != have {
|
||||
t.Errorf("want len(output) == %v, have %v", want, have)
|
||||
}
|
||||
if want, have := log.ErrMissingValue, output[1]; want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
lc.With("k1").WithPrefix("k0").Log("k2")
|
||||
if want, have := 6, len(output); want != have {
|
||||
t.Errorf("want len(output) == %v, have %v", want, have)
|
||||
}
|
||||
for i := 1; i < 6; i += 2 {
|
||||
if want, have := log.ErrMissingValue, output[i]; want != have {
|
||||
t.Errorf("want output[%d] == %#v, have %#v", i, want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Test that Context.Log has a consistent function stack depth when binding
|
||||
// log.Valuers, regardless of how many times Context.With has been called or
|
||||
// whether Context.Log is called via an interface typed variable or a concrete
|
||||
// typed variable.
|
||||
func TestContextStackDepth(t *testing.T) {
|
||||
t.Parallel()
|
||||
fn := fmt.Sprintf("%n", stack.Caller(0))
|
||||
|
||||
var output []interface{}
|
||||
|
||||
logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error {
|
||||
output = keyvals
|
||||
return nil
|
||||
}))
|
||||
|
||||
stackValuer := log.Valuer(func() interface{} {
|
||||
for i, c := range stack.Trace() {
|
||||
if fmt.Sprintf("%n", c) == fn {
|
||||
return i
|
||||
}
|
||||
}
|
||||
t.Fatal("Test function not found in stack trace.")
|
||||
return nil
|
||||
})
|
||||
|
||||
concrete := log.NewContext(logger).With("stack", stackValuer)
|
||||
var iface log.Logger = concrete
|
||||
|
||||
// Call through interface to get baseline.
|
||||
iface.Log("k", "v")
|
||||
want := output[1].(int)
|
||||
|
||||
for len(output) < 10 {
|
||||
concrete.Log("k", "v")
|
||||
if have := output[1]; have != want {
|
||||
t.Errorf("%d Withs: have %v, want %v", len(output)/2-1, have, want)
|
||||
}
|
||||
|
||||
iface.Log("k", "v")
|
||||
if have := output[1]; have != want {
|
||||
t.Errorf("%d Withs: have %v, want %v", len(output)/2-1, have, want)
|
||||
}
|
||||
|
||||
wrapped := log.NewContext(concrete)
|
||||
wrapped.Log("k", "v")
|
||||
if have := output[1]; have != want {
|
||||
t.Errorf("%d Withs: have %v, want %v", len(output)/2-1, have, want)
|
||||
}
|
||||
|
||||
concrete = concrete.With("k", "v")
|
||||
iface = concrete
|
||||
}
|
||||
}
|
||||
|
||||
// Test that With returns a Logger safe for concurrent use. This test
|
||||
// validates that the stored logging context does not get corrupted when
|
||||
// multiple clients concurrently log additional keyvals.
|
||||
//
|
||||
// This test must be run with go test -cpu 2 (or more) to achieve its goal.
|
||||
func TestWithConcurrent(t *testing.T) {
|
||||
// Create some buckets to count how many events each goroutine logs.
|
||||
const goroutines = 8
|
||||
counts := [goroutines]int{}
|
||||
|
||||
// This logger extracts a goroutine id from the last value field and
|
||||
// increments the referenced bucket.
|
||||
logger := log.LoggerFunc(func(kv ...interface{}) error {
|
||||
goroutine := kv[len(kv)-1].(int)
|
||||
counts[goroutine]++
|
||||
return nil
|
||||
})
|
||||
|
||||
// With must be careful about handling slices that can grow without
|
||||
// copying the underlying array, so give it a challenge.
|
||||
l := log.NewContext(logger).With(make([]interface{}, 0, 2)...)
|
||||
|
||||
// Start logging concurrently. Each goroutine logs its id so the logger
|
||||
// can bucket the event counts.
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(goroutines)
|
||||
const n = 10000
|
||||
for i := 0; i < goroutines; i++ {
|
||||
go func(idx int) {
|
||||
defer wg.Done()
|
||||
for j := 0; j < n; j++ {
|
||||
l.Log("goroutineIdx", idx)
|
||||
}
|
||||
}(i)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
for bucket, have := range counts {
|
||||
if want := n; want != have {
|
||||
t.Errorf("bucket %d: want %d, have %d", bucket, want, have) // note Errorf
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkDiscard(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
logger.Log("k", "v")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkOneWith(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
lc := log.NewContext(logger).With("k", "v")
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lc.Log("k", "v")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkTwoWith(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
lc := log.NewContext(logger).With("k", "v")
|
||||
for i := 1; i < 2; i++ {
|
||||
lc = lc.With("k", "v")
|
||||
}
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lc.Log("k", "v")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkTenWith(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
lc := log.NewContext(logger).With("k", "v")
|
||||
for i := 1; i < 10; i++ {
|
||||
lc = lc.With("k", "v")
|
||||
}
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lc.Log("k", "v")
|
||||
}
|
||||
}
|
57
vendor/github.com/go-kit/kit/log/logfmt_logger_test.go
generated
vendored
57
vendor/github.com/go-kit/kit/log/logfmt_logger_test.go
generated
vendored
@@ -1,57 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-logfmt/logfmt"
|
||||
)
|
||||
|
||||
func TestLogfmtLogger(t *testing.T) {
|
||||
t.Parallel()
|
||||
buf := &bytes.Buffer{}
|
||||
logger := log.NewLogfmtLogger(buf)
|
||||
|
||||
if err := logger.Log("hello", "world"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "hello=world\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
if err := logger.Log("a", 1, "err", errors.New("error")); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "a=1 err=error\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
if err := logger.Log("std_map", map[int]int{1: 2}, "my_map", mymap{0: 0}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "std_map=\""+logfmt.ErrUnsupportedValueType.Error()+"\" my_map=special_behavior\n", buf.String(); want != have {
|
||||
t.Errorf("want %#v, have %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkLogfmtLoggerSimple(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewLogfmtLogger(ioutil.Discard), baseMessage)
|
||||
}
|
||||
|
||||
func BenchmarkLogfmtLoggerContextual(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewLogfmtLogger(ioutil.Discard), withMessage)
|
||||
}
|
||||
|
||||
func TestLogfmtLoggerConcurrency(t *testing.T) {
|
||||
t.Parallel()
|
||||
testConcurrency(t, log.NewLogfmtLogger(ioutil.Discard), 10000)
|
||||
}
|
||||
|
||||
type mymap map[int]int
|
||||
|
||||
func (m mymap) String() string { return "special_behavior" }
|
26
vendor/github.com/go-kit/kit/log/nop_logger_test.go
generated
vendored
26
vendor/github.com/go-kit/kit/log/nop_logger_test.go
generated
vendored
@@ -1,26 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func TestNopLogger(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := log.NewNopLogger()
|
||||
if err := logger.Log("abc", 123); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if err := log.NewContext(logger).With("def", "ghi").Log(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkNopLoggerSimple(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewNopLogger(), baseMessage)
|
||||
}
|
||||
|
||||
func BenchmarkNopLoggerContextual(b *testing.B) {
|
||||
benchmarkRunner(b, log.NewNopLogger(), withMessage)
|
||||
}
|
205
vendor/github.com/go-kit/kit/log/stdlib_test.go
generated
vendored
205
vendor/github.com/go-kit/kit/log/stdlib_test.go
generated
vendored
@@ -1,205 +0,0 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"log"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestStdlibWriter(t *testing.T) {
|
||||
buf := &bytes.Buffer{}
|
||||
log.SetOutput(buf)
|
||||
log.SetFlags(log.LstdFlags)
|
||||
logger := NewLogfmtLogger(StdlibWriter{})
|
||||
logger.Log("key", "val")
|
||||
timestamp := time.Now().Format("2006/01/02 15:04:05")
|
||||
if want, have := timestamp+" key=val\n", buf.String(); want != have {
|
||||
t.Errorf("want %q, have %q", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStdlibAdapterUsage(t *testing.T) {
|
||||
buf := &bytes.Buffer{}
|
||||
logger := NewLogfmtLogger(buf)
|
||||
writer := NewStdlibAdapter(logger)
|
||||
stdlog := log.New(writer, "", 0)
|
||||
|
||||
now := time.Now()
|
||||
date := now.Format("2006/01/02")
|
||||
time := now.Format("15:04:05")
|
||||
|
||||
for flag, want := range map[int]string{
|
||||
0: "msg=hello\n",
|
||||
log.Ldate: "ts=" + date + " msg=hello\n",
|
||||
log.Ltime: "ts=" + time + " msg=hello\n",
|
||||
log.Ldate | log.Ltime: "ts=\"" + date + " " + time + "\" msg=hello\n",
|
||||
log.Lshortfile: "file=stdlib_test.go:44 msg=hello\n",
|
||||
log.Lshortfile | log.Ldate: "ts=" + date + " file=stdlib_test.go:44 msg=hello\n",
|
||||
log.Lshortfile | log.Ldate | log.Ltime: "ts=\"" + date + " " + time + "\" file=stdlib_test.go:44 msg=hello\n",
|
||||
} {
|
||||
buf.Reset()
|
||||
stdlog.SetFlags(flag)
|
||||
stdlog.Print("hello")
|
||||
if have := buf.String(); want != have {
|
||||
t.Errorf("flag=%d: want %#v, have %#v", flag, want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStdLibAdapterExtraction(t *testing.T) {
|
||||
buf := &bytes.Buffer{}
|
||||
logger := NewLogfmtLogger(buf)
|
||||
writer := NewStdlibAdapter(logger)
|
||||
for input, want := range map[string]string{
|
||||
"hello": "msg=hello\n",
|
||||
"2009/01/23: hello": "ts=2009/01/23 msg=hello\n",
|
||||
"2009/01/23 01:23:23: hello": "ts=\"2009/01/23 01:23:23\" msg=hello\n",
|
||||
"01:23:23: hello": "ts=01:23:23 msg=hello\n",
|
||||
"2009/01/23 01:23:23.123123: hello": "ts=\"2009/01/23 01:23:23.123123\" msg=hello\n",
|
||||
"2009/01/23 01:23:23.123123 /a/b/c/d.go:23: hello": "ts=\"2009/01/23 01:23:23.123123\" file=/a/b/c/d.go:23 msg=hello\n",
|
||||
"01:23:23.123123 /a/b/c/d.go:23: hello": "ts=01:23:23.123123 file=/a/b/c/d.go:23 msg=hello\n",
|
||||
"2009/01/23 01:23:23 /a/b/c/d.go:23: hello": "ts=\"2009/01/23 01:23:23\" file=/a/b/c/d.go:23 msg=hello\n",
|
||||
"2009/01/23 /a/b/c/d.go:23: hello": "ts=2009/01/23 file=/a/b/c/d.go:23 msg=hello\n",
|
||||
"/a/b/c/d.go:23: hello": "file=/a/b/c/d.go:23 msg=hello\n",
|
||||
} {
|
||||
buf.Reset()
|
||||
fmt.Fprint(writer, input)
|
||||
if have := buf.String(); want != have {
|
||||
t.Errorf("%q: want %#v, have %#v", input, want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStdlibAdapterSubexps(t *testing.T) {
|
||||
for input, wantMap := range map[string]map[string]string{
|
||||
"hello world": {
|
||||
"date": "",
|
||||
"time": "",
|
||||
"file": "",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "",
|
||||
"file": "",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23",
|
||||
"file": "",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"01:23:23: hello world": {
|
||||
"date": "",
|
||||
"time": "01:23:23",
|
||||
"file": "",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23.123123: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23.123123 /a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"01:23:23.123123 /a/b/c/d.go:23: hello world": {
|
||||
"date": "",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23 /a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23",
|
||||
"file": "/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 /a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "",
|
||||
"file": "/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"/a/b/c/d.go:23: hello world": {
|
||||
"date": "",
|
||||
"time": "",
|
||||
"file": "/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23.123123 C:/a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"01:23:23.123123 C:/a/b/c/d.go:23: hello world": {
|
||||
"date": "",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23 C:/a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 C:/a/b/c/d.go:23: hello world": {
|
||||
"date": "2009/01/23",
|
||||
"time": "",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"C:/a/b/c/d.go:23: hello world": {
|
||||
"date": "",
|
||||
"time": "",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": "hello world",
|
||||
},
|
||||
"2009/01/23 01:23:23.123123 C:/a/b/c/d.go:23: :.;<>_#{[]}\"\\": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": ":.;<>_#{[]}\"\\",
|
||||
},
|
||||
"01:23:23.123123 C:/a/b/c/d.go:23: :.;<>_#{[]}\"\\": {
|
||||
"date": "",
|
||||
"time": "01:23:23.123123",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": ":.;<>_#{[]}\"\\",
|
||||
},
|
||||
"2009/01/23 01:23:23 C:/a/b/c/d.go:23: :.;<>_#{[]}\"\\": {
|
||||
"date": "2009/01/23",
|
||||
"time": "01:23:23",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": ":.;<>_#{[]}\"\\",
|
||||
},
|
||||
"2009/01/23 C:/a/b/c/d.go:23: :.;<>_#{[]}\"\\": {
|
||||
"date": "2009/01/23",
|
||||
"time": "",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": ":.;<>_#{[]}\"\\",
|
||||
},
|
||||
"C:/a/b/c/d.go:23: :.;<>_#{[]}\"\\": {
|
||||
"date": "",
|
||||
"time": "",
|
||||
"file": "C:/a/b/c/d.go:23",
|
||||
"msg": ":.;<>_#{[]}\"\\",
|
||||
},
|
||||
} {
|
||||
haveMap := subexps([]byte(input))
|
||||
for key, want := range wantMap {
|
||||
if have := haveMap[key]; want != have {
|
||||
t.Errorf("%q: %q: want %q, have %q", input, key, want, have)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
72
vendor/github.com/go-kit/kit/log/sync_test.go
generated
vendored
72
vendor/github.com/go-kit/kit/log/sync_test.go
generated
vendored
@@ -1,72 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func TestSwapLogger(t *testing.T) {
|
||||
t.Parallel()
|
||||
var logger log.SwapLogger
|
||||
|
||||
// Zero value does not panic or error.
|
||||
err := logger.Log("k", "v")
|
||||
if got, want := err, error(nil); got != want {
|
||||
t.Errorf("got %v, want %v", got, want)
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
json := log.NewJSONLogger(buf)
|
||||
logger.Swap(json)
|
||||
|
||||
if err := logger.Log("k", "v"); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if got, want := buf.String(), `{"k":"v"}`+"\n"; got != want {
|
||||
t.Errorf("got %v, want %v", got, want)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
prefix := log.NewLogfmtLogger(buf)
|
||||
logger.Swap(prefix)
|
||||
|
||||
if err := logger.Log("k", "v"); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if got, want := buf.String(), "k=v\n"; got != want {
|
||||
t.Errorf("got %v, want %v", got, want)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Swap(nil)
|
||||
|
||||
if err := logger.Log("k", "v"); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if got, want := buf.String(), ""; got != want {
|
||||
t.Errorf("got %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSwapLoggerConcurrency(t *testing.T) {
|
||||
t.Parallel()
|
||||
testConcurrency(t, &log.SwapLogger{}, 10000)
|
||||
}
|
||||
|
||||
func TestSyncLoggerConcurrency(t *testing.T) {
|
||||
var w io.Writer
|
||||
w = &bytes.Buffer{}
|
||||
logger := log.NewLogfmtLogger(w)
|
||||
logger = log.NewSyncLogger(logger)
|
||||
testConcurrency(t, logger, 10000)
|
||||
}
|
||||
|
||||
func TestSyncWriterConcurrency(t *testing.T) {
|
||||
var w io.Writer
|
||||
w = &bytes.Buffer{}
|
||||
w = log.NewSyncWriter(w)
|
||||
testConcurrency(t, log.NewLogfmtLogger(w), 10000)
|
||||
}
|
21
vendor/github.com/go-kit/kit/log/term/LICENSE
generated
vendored
21
vendor/github.com/go-kit/kit/log/term/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Simon Eskildsen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
144
vendor/github.com/go-kit/kit/log/term/colorlogger.go
generated
vendored
144
vendor/github.com/go-kit/kit/log/term/colorlogger.go
generated
vendored
@@ -1,144 +0,0 @@
|
||||
package term
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"sync"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
// Color represents an ANSI color. The zero value is Default.
|
||||
type Color uint8
|
||||
|
||||
// ANSI colors.
|
||||
const (
|
||||
Default = Color(iota)
|
||||
|
||||
Black
|
||||
DarkRed
|
||||
DarkGreen
|
||||
Brown
|
||||
DarkBlue
|
||||
DarkMagenta
|
||||
DarkCyan
|
||||
Gray
|
||||
|
||||
DarkGray
|
||||
Red
|
||||
Green
|
||||
Yellow
|
||||
Blue
|
||||
Magenta
|
||||
Cyan
|
||||
White
|
||||
|
||||
numColors
|
||||
)
|
||||
|
||||
// For more on ANSI escape codes see
|
||||
// https://en.wikipedia.org/wiki/ANSI_escape_code. See in particular
|
||||
// https://en.wikipedia.org/wiki/ANSI_escape_code#Colors.
|
||||
|
||||
var (
|
||||
resetColorBytes = []byte("\x1b[39;49m")
|
||||
fgColorBytes [][]byte
|
||||
bgColorBytes [][]byte
|
||||
)
|
||||
|
||||
func init() {
|
||||
// Default
|
||||
fgColorBytes = append(fgColorBytes, []byte("\x1b[39m"))
|
||||
bgColorBytes = append(bgColorBytes, []byte("\x1b[49m"))
|
||||
|
||||
// dark colors
|
||||
for color := Black; color < DarkGray; color++ {
|
||||
fgColorBytes = append(fgColorBytes, []byte(fmt.Sprintf("\x1b[%dm", 30+color-Black)))
|
||||
bgColorBytes = append(bgColorBytes, []byte(fmt.Sprintf("\x1b[%dm", 40+color-Black)))
|
||||
}
|
||||
|
||||
// bright colors
|
||||
for color := DarkGray; color < numColors; color++ {
|
||||
fgColorBytes = append(fgColorBytes, []byte(fmt.Sprintf("\x1b[%d;1m", 30+color-DarkGray)))
|
||||
bgColorBytes = append(bgColorBytes, []byte(fmt.Sprintf("\x1b[%d;1m", 40+color-DarkGray)))
|
||||
}
|
||||
}
|
||||
|
||||
// FgBgColor represents a foreground and background color.
|
||||
type FgBgColor struct {
|
||||
Fg, Bg Color
|
||||
}
|
||||
|
||||
func (c FgBgColor) isZero() bool {
|
||||
return c.Fg == Default && c.Bg == Default
|
||||
}
|
||||
|
||||
// NewColorLogger returns a Logger which writes colored logs to w. ANSI color
|
||||
// codes for the colors returned by color are added to the formatted output
|
||||
// from the Logger returned by newLogger and the combined result written to w.
|
||||
func NewColorLogger(w io.Writer, newLogger func(io.Writer) log.Logger, color func(keyvals ...interface{}) FgBgColor) log.Logger {
|
||||
if color == nil {
|
||||
panic("color func nil")
|
||||
}
|
||||
return &colorLogger{
|
||||
w: w,
|
||||
newLogger: newLogger,
|
||||
color: color,
|
||||
bufPool: sync.Pool{New: func() interface{} { return &loggerBuf{} }},
|
||||
noColorLogger: newLogger(w),
|
||||
}
|
||||
}
|
||||
|
||||
type colorLogger struct {
|
||||
w io.Writer
|
||||
newLogger func(io.Writer) log.Logger
|
||||
color func(keyvals ...interface{}) FgBgColor
|
||||
bufPool sync.Pool
|
||||
noColorLogger log.Logger
|
||||
}
|
||||
|
||||
func (l *colorLogger) Log(keyvals ...interface{}) error {
|
||||
color := l.color(keyvals...)
|
||||
if color.isZero() {
|
||||
return l.noColorLogger.Log(keyvals...)
|
||||
}
|
||||
|
||||
lb := l.getLoggerBuf()
|
||||
defer l.putLoggerBuf(lb)
|
||||
if color.Fg != Default {
|
||||
lb.buf.Write(fgColorBytes[color.Fg])
|
||||
}
|
||||
if color.Bg != Default {
|
||||
lb.buf.Write(bgColorBytes[color.Bg])
|
||||
}
|
||||
err := lb.logger.Log(keyvals...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if color.Fg != Default || color.Bg != Default {
|
||||
lb.buf.Write(resetColorBytes)
|
||||
}
|
||||
_, err = io.Copy(l.w, lb.buf)
|
||||
return err
|
||||
}
|
||||
|
||||
type loggerBuf struct {
|
||||
buf *bytes.Buffer
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
func (l *colorLogger) getLoggerBuf() *loggerBuf {
|
||||
lb := l.bufPool.Get().(*loggerBuf)
|
||||
if lb.buf == nil {
|
||||
lb.buf = &bytes.Buffer{}
|
||||
lb.logger = l.newLogger(lb.buf)
|
||||
} else {
|
||||
lb.buf.Reset()
|
||||
}
|
||||
return lb
|
||||
}
|
||||
|
||||
func (l *colorLogger) putLoggerBuf(cb *loggerBuf) {
|
||||
l.bufPool.Put(cb)
|
||||
}
|
88
vendor/github.com/go-kit/kit/log/term/colorlogger_test.go
generated
vendored
88
vendor/github.com/go-kit/kit/log/term/colorlogger_test.go
generated
vendored
@@ -1,88 +0,0 @@
|
||||
package term_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"strconv"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/log/term"
|
||||
)
|
||||
|
||||
func TestColorLogger(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
logger := newColorLogger(&buf)
|
||||
|
||||
if err := logger.Log("hello", "world"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "hello=world\n", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
if err := logger.Log("a", 1); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want, have := "\x1b[32;1m\x1b[47;1ma=1\n\x1b[39;49m", buf.String(); want != have {
|
||||
t.Errorf("\nwant %#v\nhave %#v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func newColorLogger(w io.Writer) log.Logger {
|
||||
return term.NewColorLogger(w, log.NewLogfmtLogger,
|
||||
func(keyvals ...interface{}) term.FgBgColor {
|
||||
if keyvals[0] == "a" {
|
||||
return term.FgBgColor{Fg: term.Green, Bg: term.White}
|
||||
}
|
||||
return term.FgBgColor{}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkColorLoggerSimple(b *testing.B) {
|
||||
benchmarkRunner(b, newColorLogger(ioutil.Discard), baseMessage)
|
||||
}
|
||||
|
||||
func BenchmarkColorLoggerContextual(b *testing.B) {
|
||||
benchmarkRunner(b, newColorLogger(ioutil.Discard), withMessage)
|
||||
}
|
||||
|
||||
func TestColorLoggerConcurrency(t *testing.T) {
|
||||
testConcurrency(t, newColorLogger(ioutil.Discard))
|
||||
}
|
||||
|
||||
// copied from log/benchmark_test.go
|
||||
func benchmarkRunner(b *testing.B, logger log.Logger, f func(log.Logger)) {
|
||||
lc := log.NewContext(logger).With("common_key", "common_value")
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
f(lc)
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
baseMessage = func(logger log.Logger) { logger.Log("foo_key", "foo_value") }
|
||||
withMessage = func(logger log.Logger) { log.NewContext(logger).With("a", "b").Log("c", "d") }
|
||||
)
|
||||
|
||||
// copied from log/concurrency_test.go
|
||||
func testConcurrency(t *testing.T, logger log.Logger) {
|
||||
for _, n := range []int{10, 100, 500} {
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(n)
|
||||
for i := 0; i < n; i++ {
|
||||
go func() { spam(logger); wg.Done() }()
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
}
|
||||
|
||||
func spam(logger log.Logger) {
|
||||
for i := 0; i < 100; i++ {
|
||||
logger.Log("a", strconv.FormatInt(int64(i), 10))
|
||||
}
|
||||
}
|
12
vendor/github.com/go-kit/kit/log/term/colorwriter_others.go
generated
vendored
12
vendor/github.com/go-kit/kit/log/term/colorwriter_others.go
generated
vendored
@@ -1,12 +0,0 @@
|
||||
// +build !windows
|
||||
|
||||
package term
|
||||
|
||||
import "io"
|
||||
|
||||
// NewColorWriter returns an io.Writer that writes to w and provides cross
|
||||
// platform support for ANSI color codes. If w is not a terminal it is
|
||||
// returned unmodified.
|
||||
func NewColorWriter(w io.Writer) io.Writer {
|
||||
return w
|
||||
}
|
190
vendor/github.com/go-kit/kit/log/term/colorwriter_windows.go
generated
vendored
190
vendor/github.com/go-kit/kit/log/term/colorwriter_windows.go
generated
vendored
@@ -1,190 +0,0 @@
|
||||
// The code in this file is adapted from github.com/mattn/go-colorable.
|
||||
|
||||
// +build windows
|
||||
|
||||
package term
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type colorWriter struct {
|
||||
out io.Writer
|
||||
handle syscall.Handle
|
||||
lastbuf bytes.Buffer
|
||||
oldattr word
|
||||
}
|
||||
|
||||
// NewColorWriter returns an io.Writer that writes to w and provides cross
|
||||
// platform support for ANSI color codes. If w is not a terminal it is
|
||||
// returned unmodified.
|
||||
func NewColorWriter(w io.Writer) io.Writer {
|
||||
if !IsTerminal(w) {
|
||||
return w
|
||||
}
|
||||
|
||||
var csbi consoleScreenBufferInfo
|
||||
handle := syscall.Handle(w.(fder).Fd())
|
||||
procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))
|
||||
|
||||
return &colorWriter{
|
||||
out: w,
|
||||
handle: handle,
|
||||
oldattr: csbi.attributes,
|
||||
}
|
||||
}
|
||||
|
||||
func (w *colorWriter) Write(data []byte) (n int, err error) {
|
||||
var csbi consoleScreenBufferInfo
|
||||
procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
|
||||
|
||||
er := bytes.NewBuffer(data)
|
||||
loop:
|
||||
for {
|
||||
r1, _, err := procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
|
||||
if r1 == 0 {
|
||||
break loop
|
||||
}
|
||||
|
||||
c1, _, err := er.ReadRune()
|
||||
if err != nil {
|
||||
break loop
|
||||
}
|
||||
if c1 != 0x1b {
|
||||
fmt.Fprint(w.out, string(c1))
|
||||
continue
|
||||
}
|
||||
c2, _, err := er.ReadRune()
|
||||
if err != nil {
|
||||
w.lastbuf.WriteRune(c1)
|
||||
break loop
|
||||
}
|
||||
if c2 != 0x5b {
|
||||
w.lastbuf.WriteRune(c1)
|
||||
w.lastbuf.WriteRune(c2)
|
||||
continue
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
var m rune
|
||||
for {
|
||||
c, _, err := er.ReadRune()
|
||||
if err != nil {
|
||||
w.lastbuf.WriteRune(c1)
|
||||
w.lastbuf.WriteRune(c2)
|
||||
w.lastbuf.Write(buf.Bytes())
|
||||
break loop
|
||||
}
|
||||
if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
|
||||
m = c
|
||||
break
|
||||
}
|
||||
buf.Write([]byte(string(c)))
|
||||
}
|
||||
|
||||
switch m {
|
||||
case 'm':
|
||||
attr := csbi.attributes
|
||||
cs := buf.String()
|
||||
if cs == "" {
|
||||
procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr))
|
||||
continue
|
||||
}
|
||||
token := strings.Split(cs, ";")
|
||||
intensityMode := word(0)
|
||||
for _, ns := range token {
|
||||
if n, err = strconv.Atoi(ns); err == nil {
|
||||
switch {
|
||||
case n == 0:
|
||||
attr = w.oldattr
|
||||
case n == 1:
|
||||
attr |= intensityMode
|
||||
case 30 <= n && n <= 37:
|
||||
attr = (attr & backgroundMask)
|
||||
if (n-30)&1 != 0 {
|
||||
attr |= foregroundRed
|
||||
}
|
||||
if (n-30)&2 != 0 {
|
||||
attr |= foregroundGreen
|
||||
}
|
||||
if (n-30)&4 != 0 {
|
||||
attr |= foregroundBlue
|
||||
}
|
||||
intensityMode = foregroundIntensity
|
||||
case n == 39: // reset foreground color
|
||||
attr &= backgroundMask
|
||||
attr |= w.oldattr & foregroundMask
|
||||
case 40 <= n && n <= 47:
|
||||
attr = (attr & foregroundMask)
|
||||
if (n-40)&1 != 0 {
|
||||
attr |= backgroundRed
|
||||
}
|
||||
if (n-40)&2 != 0 {
|
||||
attr |= backgroundGreen
|
||||
}
|
||||
if (n-40)&4 != 0 {
|
||||
attr |= backgroundBlue
|
||||
}
|
||||
intensityMode = backgroundIntensity
|
||||
case n == 49: // reset background color
|
||||
attr &= foregroundMask
|
||||
attr |= w.oldattr & backgroundMask
|
||||
}
|
||||
procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return len(data) - w.lastbuf.Len(), nil
|
||||
}
|
||||
|
||||
var (
|
||||
procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
|
||||
procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute")
|
||||
)
|
||||
|
||||
const (
|
||||
foregroundBlue = 0x1
|
||||
foregroundGreen = 0x2
|
||||
foregroundRed = 0x4
|
||||
foregroundIntensity = 0x8
|
||||
foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity)
|
||||
backgroundBlue = 0x10
|
||||
backgroundGreen = 0x20
|
||||
backgroundRed = 0x40
|
||||
backgroundIntensity = 0x80
|
||||
backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity)
|
||||
)
|
||||
|
||||
type (
|
||||
wchar uint16
|
||||
short int16
|
||||
dword uint32
|
||||
word uint16
|
||||
)
|
||||
|
||||
type coord struct {
|
||||
x short
|
||||
y short
|
||||
}
|
||||
|
||||
type smallRect struct {
|
||||
left short
|
||||
top short
|
||||
right short
|
||||
bottom short
|
||||
}
|
||||
|
||||
type consoleScreenBufferInfo struct {
|
||||
size coord
|
||||
cursorPosition coord
|
||||
attributes word
|
||||
window smallRect
|
||||
maximumWindowSize coord
|
||||
}
|
57
vendor/github.com/go-kit/kit/log/term/example_test.go
generated
vendored
57
vendor/github.com/go-kit/kit/log/term/example_test.go
generated
vendored
@@ -1,57 +0,0 @@
|
||||
package term_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/log/term"
|
||||
)
|
||||
|
||||
func ExampleNewLogger_redErrors() {
|
||||
// Color errors red
|
||||
colorFn := func(keyvals ...interface{}) term.FgBgColor {
|
||||
for i := 1; i < len(keyvals); i += 2 {
|
||||
if _, ok := keyvals[i].(error); ok {
|
||||
return term.FgBgColor{Fg: term.White, Bg: term.Red}
|
||||
}
|
||||
}
|
||||
return term.FgBgColor{}
|
||||
}
|
||||
|
||||
logger := term.NewLogger(os.Stdout, log.NewLogfmtLogger, colorFn)
|
||||
|
||||
logger.Log("msg", "default color", "err", nil)
|
||||
logger.Log("msg", "colored because of error", "err", errors.New("coloring error"))
|
||||
}
|
||||
|
||||
func ExampleNewLogger_levelColors() {
|
||||
// Color by level value
|
||||
colorFn := func(keyvals ...interface{}) term.FgBgColor {
|
||||
for i := 0; i < len(keyvals)-1; i += 2 {
|
||||
if keyvals[i] != "level" {
|
||||
continue
|
||||
}
|
||||
switch keyvals[i+1] {
|
||||
case "debug":
|
||||
return term.FgBgColor{Fg: term.DarkGray}
|
||||
case "info":
|
||||
return term.FgBgColor{Fg: term.Gray}
|
||||
case "warn":
|
||||
return term.FgBgColor{Fg: term.Yellow}
|
||||
case "error":
|
||||
return term.FgBgColor{Fg: term.Red}
|
||||
case "crit":
|
||||
return term.FgBgColor{Fg: term.Gray, Bg: term.DarkRed}
|
||||
default:
|
||||
return term.FgBgColor{}
|
||||
}
|
||||
}
|
||||
return term.FgBgColor{}
|
||||
}
|
||||
|
||||
logger := term.NewLogger(os.Stdout, log.NewJSONLogger, colorFn)
|
||||
|
||||
logger.Log("level", "warn", "msg", "yellow")
|
||||
logger.Log("level", "debug", "msg", "dark gray")
|
||||
}
|
22
vendor/github.com/go-kit/kit/log/term/term.go
generated
vendored
22
vendor/github.com/go-kit/kit/log/term/term.go
generated
vendored
@@ -1,22 +0,0 @@
|
||||
// Package term provides tools for logging to a terminal.
|
||||
package term
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
// NewLogger returns a Logger that takes advantage of terminal features if
|
||||
// possible. Log events are formatted by the Logger returned by newLogger. If
|
||||
// w is a terminal each log event is colored according to the color function.
|
||||
func NewLogger(w io.Writer, newLogger func(io.Writer) log.Logger, color func(keyvals ...interface{}) FgBgColor) log.Logger {
|
||||
if !IsTerminal(w) {
|
||||
return newLogger(w)
|
||||
}
|
||||
return NewColorLogger(NewColorWriter(w), newLogger, color)
|
||||
}
|
||||
|
||||
type fder interface {
|
||||
Fd() uintptr
|
||||
}
|
15
vendor/github.com/go-kit/kit/log/term/terminal_appengine.go
generated
vendored
15
vendor/github.com/go-kit/kit/log/term/terminal_appengine.go
generated
vendored
@@ -1,15 +0,0 @@
|
||||
// Based on ssh/terminal:
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build appengine
|
||||
|
||||
package term
|
||||
|
||||
import "io"
|
||||
|
||||
// IsTerminal always returns false on AppEngine.
|
||||
func IsTerminal(w io.Writer) bool {
|
||||
return false
|
||||
}
|
10
vendor/github.com/go-kit/kit/log/term/terminal_darwin.go
generated
vendored
10
vendor/github.com/go-kit/kit/log/term/terminal_darwin.go
generated
vendored
@@ -1,10 +0,0 @@
|
||||
// Based on ssh/terminal:
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package term
|
||||
|
||||
import "syscall"
|
||||
|
||||
const ioctlReadTermios = syscall.TIOCGETA
|
7
vendor/github.com/go-kit/kit/log/term/terminal_freebsd.go
generated
vendored
7
vendor/github.com/go-kit/kit/log/term/terminal_freebsd.go
generated
vendored
@@ -1,7 +0,0 @@
|
||||
package term
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
)
|
||||
|
||||
const ioctlReadTermios = syscall.TIOCGETA
|
12
vendor/github.com/go-kit/kit/log/term/terminal_linux.go
generated
vendored
12
vendor/github.com/go-kit/kit/log/term/terminal_linux.go
generated
vendored
@@ -1,12 +0,0 @@
|
||||
// Based on ssh/terminal:
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !appengine
|
||||
|
||||
package term
|
||||
|
||||
import "syscall"
|
||||
|
||||
const ioctlReadTermios = syscall.TCGETS
|
25
vendor/github.com/go-kit/kit/log/term/terminal_notwindows.go
generated
vendored
25
vendor/github.com/go-kit/kit/log/term/terminal_notwindows.go
generated
vendored
@@ -1,25 +0,0 @@
|
||||
// Based on ssh/terminal:
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build linux,!appengine darwin freebsd openbsd
|
||||
|
||||
package term
|
||||
|
||||
import (
|
||||
"io"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// IsTerminal returns true if w writes to a terminal.
|
||||
func IsTerminal(w io.Writer) bool {
|
||||
fw, ok := w.(fder)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
var termios syscall.Termios
|
||||
_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fw.Fd(), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
|
||||
return err == 0
|
||||
}
|
5
vendor/github.com/go-kit/kit/log/term/terminal_openbsd.go
generated
vendored
5
vendor/github.com/go-kit/kit/log/term/terminal_openbsd.go
generated
vendored
@@ -1,5 +0,0 @@
|
||||
package term
|
||||
|
||||
import "syscall"
|
||||
|
||||
const ioctlReadTermios = syscall.TIOCGETA
|
31
vendor/github.com/go-kit/kit/log/term/terminal_windows.go
generated
vendored
31
vendor/github.com/go-kit/kit/log/term/terminal_windows.go
generated
vendored
@@ -1,31 +0,0 @@
|
||||
// Based on ssh/terminal:
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build windows
|
||||
|
||||
package term
|
||||
|
||||
import (
|
||||
"io"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||
|
||||
var (
|
||||
procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
|
||||
)
|
||||
|
||||
// IsTerminal returns true if w writes to a terminal.
|
||||
func IsTerminal(w io.Writer) bool {
|
||||
fw, ok := w.(fder)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
var st uint32
|
||||
r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fw.Fd(), uintptr(unsafe.Pointer(&st)), 0)
|
||||
return r != 0 && e == 0
|
||||
}
|
111
vendor/github.com/go-kit/kit/log/value_test.go
generated
vendored
111
vendor/github.com/go-kit/kit/log/value_test.go
generated
vendored
@@ -1,111 +0,0 @@
|
||||
package log_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func TestValueBinding(t *testing.T) {
|
||||
t.Parallel()
|
||||
var output []interface{}
|
||||
|
||||
logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error {
|
||||
output = keyvals
|
||||
return nil
|
||||
}))
|
||||
|
||||
start := time.Date(2015, time.April, 25, 0, 0, 0, 0, time.UTC)
|
||||
now := start
|
||||
mocktime := func() time.Time {
|
||||
now = now.Add(time.Second)
|
||||
return now
|
||||
}
|
||||
|
||||
lc := log.NewContext(logger).With("ts", log.Timestamp(mocktime), "caller", log.DefaultCaller)
|
||||
|
||||
lc.Log("foo", "bar")
|
||||
timestamp, ok := output[1].(time.Time)
|
||||
if !ok {
|
||||
t.Fatalf("want time.Time, have %T", output[1])
|
||||
}
|
||||
if want, have := start.Add(time.Second), timestamp; want != have {
|
||||
t.Errorf("output[1]: want %v, have %v", want, have)
|
||||
}
|
||||
if want, have := "value_test.go:29", fmt.Sprint(output[3]); want != have {
|
||||
t.Errorf("output[3]: want %s, have %s", want, have)
|
||||
}
|
||||
|
||||
// A second attempt to confirm the bindings are truly dynamic.
|
||||
lc.Log("foo", "bar")
|
||||
timestamp, ok = output[1].(time.Time)
|
||||
if !ok {
|
||||
t.Fatalf("want time.Time, have %T", output[1])
|
||||
}
|
||||
if want, have := start.Add(2*time.Second), timestamp; want != have {
|
||||
t.Errorf("output[1]: want %v, have %v", want, have)
|
||||
}
|
||||
if want, have := "value_test.go:42", fmt.Sprint(output[3]); want != have {
|
||||
t.Errorf("output[3]: want %s, have %s", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func TestValueBinding_loggingZeroKeyvals(t *testing.T) {
|
||||
t.Parallel()
|
||||
var output []interface{}
|
||||
|
||||
logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error {
|
||||
output = keyvals
|
||||
return nil
|
||||
}))
|
||||
|
||||
start := time.Date(2015, time.April, 25, 0, 0, 0, 0, time.UTC)
|
||||
now := start
|
||||
mocktime := func() time.Time {
|
||||
now = now.Add(time.Second)
|
||||
return now
|
||||
}
|
||||
|
||||
logger = log.NewContext(logger).With("ts", log.Timestamp(mocktime))
|
||||
|
||||
logger.Log()
|
||||
timestamp, ok := output[1].(time.Time)
|
||||
if !ok {
|
||||
t.Fatalf("want time.Time, have %T", output[1])
|
||||
}
|
||||
if want, have := start.Add(time.Second), timestamp; want != have {
|
||||
t.Errorf("output[1]: want %v, have %v", want, have)
|
||||
}
|
||||
|
||||
// A second attempt to confirm the bindings are truly dynamic.
|
||||
logger.Log()
|
||||
timestamp, ok = output[1].(time.Time)
|
||||
if !ok {
|
||||
t.Fatalf("want time.Time, have %T", output[1])
|
||||
}
|
||||
if want, have := start.Add(2*time.Second), timestamp; want != have {
|
||||
t.Errorf("output[1]: want %v, have %v", want, have)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkValueBindingTimestamp(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
lc := log.NewContext(logger).With("ts", log.DefaultTimestamp)
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lc.Log("k", "v")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkValueBindingCaller(b *testing.B) {
|
||||
logger := log.NewNopLogger()
|
||||
lc := log.NewContext(logger).With("caller", log.DefaultCaller)
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lc.Log("k", "v")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user