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 TestDefaultLevels(t *testing.T) { buf := bytes.Buffer{} logger := levels.New(log.NewLogfmtLogger(&buf)) logger.Debug("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("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("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("msg", " ") if want, have := "level=crit msg=\"\\t\"\n", buf.String(); want != have { t.Errorf("want %#v, have %#v", want, have) } }
func ExampleLevels() { logger := levels.New(log.NewLogfmtLogger(os.Stdout)) logger.Debug("msg", "hello") logger.With("context", "foo").Warn("err", "error") // Output: // level=debug msg=hello // level=warn context=foo err=error }
func ExampleContext() { logger := log.NewLogfmtLogger(os.Stdout) logger.Log("foo", 123) ctx := log.NewContext(logger).With("level", "info") ctx.Log() ctx = ctx.With("msg", "hello") ctx.Log() ctx.With("a", 1).Log("b", 2) // Output: // foo=123 // level=info // level=info msg=hello // level=info msg=hello a=1 b=2 }
func TestSwapLogger(t *testing.T) { 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) } }