From 6a8ddfd5326aefe3c56c5207fc1d4228fe36f8df Mon Sep 17 00:00:00 2001 From: Pierre-Henri Symoneaux Date: Wed, 16 Aug 2023 10:36:10 +0200 Subject: [PATCH] Update readme and benchmark codes --- README.md | 38 +++++++++++++++++++++++++++++++++ bench_test.go | 30 ++++++++++---------------- doc/img/output-with-source.png | Bin 0 -> 28348 bytes doc/img/output.png | Bin 0 -> 22374 bytes 4 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 doc/img/output-with-source.png create mode 100644 doc/img/output.png diff --git a/README.md b/README.md index a8a0182..90edb41 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,41 @@ [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/phsym/console-slog) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/phsym/console-slog/master/LICENSE) [![Build](https://github.com/phsym/console-slog/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/phsym/zeroslog/actions/workflows/go.yml) A handler for slog that prints colorized logs, similar to zerolog's console writer output + +## Example +```go +package main + +import ( + "errors" + "log/slog" + "os" + + "github.com/phsym/console-slog" +) + +func main() { + logger := slog.New( + console.NewHandler(os.Stderr, &console.HandlerOptions{Level: slog.LevelDebug}), + ) + slog.SetDefault(logger) + slog.Info("Hello world!", "foo", "bar") + slog.Debug("Debug message") + slog.Warn("Warning message") + slog.Error("Error message", "err", errors.New("the error")) + + logger = logger.With("foo", "bar"). + WithGroup("the-group"). + With("bar", "baz") + + logger.Info("group info", "attr", "value") +} +``` + +![output](./doc/img/output.png) + +When setting `console.HandlerOptions.AddSource` to `true`: +```go +console.NewHandler(os.Stderr, &console.HandlerOptions{Level: slog.LevelDebug, AddSource: true}) +``` +![output-with-source](./doc/img/output-with-source.png) \ No newline at end of file diff --git a/bench_test.go b/bench_test.go index 21840dc..13e0061 100644 --- a/bench_test.go +++ b/bench_test.go @@ -27,9 +27,8 @@ var handlers = []struct { } var attrs = []slog.Attr{ - slog.String("titi", "toto"), - slog.String("tata", "tutu"), - slog.Int("foo", 12), + slog.String("foo", "bar"), + slog.Int("int", 12), slog.Duration("dur", 3*time.Second), slog.Bool("bool", true), slog.Float64("float", 23.7), @@ -39,27 +38,20 @@ var attrs = []slog.Attr{ slog.Group("group", slog.String("bar", "baz")), } -var attrsAny = []any{ - slog.String("titi", "toto"), - slog.String("tata", "tutu"), - slog.Int("foo", 12), - slog.Duration("dur", 3*time.Second), - slog.Bool("bool", true), - slog.Float64("float", 23.7), - slog.Time("thetime", time.Now()), - slog.Any("err", errors.New("yo")), - slog.Group("empty"), - slog.Group("group", slog.String("bar", "baz")), -} +var attrsAny = func() (a []any) { + for _, attr := range attrs { + a = append(a, attr) + } + return +}() func BenchmarkHandlers(b *testing.B) { ctx := context.Background() - rec := slog.NewRecord(time.Now(), slog.LevelInfo, "yo", 0) + rec := slog.NewRecord(time.Now(), slog.LevelInfo, "hello", 0) rec.AddAttrs(attrs...) for _, tc := range handlers { b.Run(tc.name, func(b *testing.B) { - // l := tc.hdl.WithAttrs([]slog.Attr{slog.String("toto", "tutu")}) //.WithGroup("test") l := tc.hdl.WithAttrs(attrs).WithGroup("test").WithAttrs(attrs) // Warm-up l.Handle(ctx, rec) @@ -77,10 +69,10 @@ func BenchmarkLoggers(b *testing.B) { b.Run(tc.name, func(b *testing.B) { l := slog.New(tc.hdl).With(attrsAny...).WithGroup("test").With(attrsAny...) // Warm-up - l.LogAttrs(ctx, slog.LevelInfo, "yo", attrs...) + l.LogAttrs(ctx, slog.LevelInfo, "hello", attrs...) b.ResetTimer() for i := 0; i < b.N; i++ { - l.LogAttrs(ctx, slog.LevelInfo, "yo", attrs...) + l.LogAttrs(ctx, slog.LevelInfo, "hello", attrs...) } }) } diff --git a/doc/img/output-with-source.png b/doc/img/output-with-source.png new file mode 100644 index 0000000000000000000000000000000000000000..8b72bb0c1ea767b85978a3854c7ef89a8babbe73 GIT binary patch literal 28348 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 Nm{>}Zwc;kh{|j?q-5vk{ literal 0 HcmV?d00001 diff --git a/doc/img/output.png b/doc/img/output.png new file mode 100644 index 0000000000000000000000000000000000000000..6424df385c397756be8a85174dc90ccff0d76982 GIT binary patch literal 22374 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