package mlog import ( "bytes" "context" "errors" "fmt" "strings" "testing" . "testing" "time" "code.betamike.com/mediocregopher/mediocre-go-lib/internal/massert" "code.betamike.com/mediocregopher/mediocre-go-lib/mctx" ) func TestTruncate(t *T) { massert.Equal(t, "abc", Truncate("abc", 4)) massert.Equal(t, "abc", Truncate("abc", 3)) massert.Equal(t, "ab...", Truncate("abc", 2)) } func TestJSONLogger(t *T) { buf := new(bytes.Buffer) now := time.Now().UTC() td, ts := now.Format(msgTimeFormat), fmt.Sprint(now.UnixNano()) l := NewLogger(&LoggerOpts{ MessageHandler: NewJSONMessageHandler(buf), Now: func() time.Time { return now }, }) assertOut := func(t *testing.T, expected string) { expected = strings.ReplaceAll(expected, "", td) expected = strings.ReplaceAll(expected, "", ts) out, err := buf.ReadString('\n') massert.Equal(t, nil, err) massert.Equal(t, expected, strings.TrimSpace(out)) } ctx := context.Background() // Default max level should be INFO l.Debug(ctx, "foo") l.Info(ctx, "bar") l.Warn(ctx, "baz", errors.New("ERR")) l.Error(ctx, "buz", errors.New("ERR")) assertOut(t, `{"td":"","ts":,"level":"INFO","descr":"bar","level_int":30}`) assertOut(t, `{"td":"","ts":,"level":"WARN","descr":"baz","level_int":20,"annotations":{"errMsg":"ERR"}}`) assertOut(t, `{"td":"","ts":,"level":"ERROR","descr":"buz","level_int":10,"annotations":{"errMsg":"ERR"}}`) // annotate context ctx = mctx.Annotate(ctx, "foo", "bar") l.Info(ctx, "bar") assertOut(t, `{"td":"","ts":,"level":"INFO","descr":"bar","level_int":30,"annotations":{"foo":"bar"}}`) // add namespace l = l.WithNamespace("ns") l.Info(ctx, "bar") assertOut(t, `{"td":"","ts":,"level":"INFO","ns":["ns"],"descr":"bar","level_int":30,"annotations":{"foo":"bar"}}`) }