| .woodpecker | ||
| example | ||
| .gitignore | ||
| .goreleaser.yaml | ||
| go.mod | ||
| go.sum | ||
| handler.go | ||
| handler_test.go | ||
| LICENSE | ||
| Makefile | ||
| Makefile.dist | ||
| README.md | ||
yadu - a human readable yaml based slog.Handler
Introduction
Package yadu provides a handler for the log/slog logging framework.
It generates a mixture of text lines containing the timestamp and log message and a YAML dump of the provided attibutes.
Log format
The log format generated by yadu looks like this:
2023-04-02T10:50.09 EDT LEVEL Message text foo: value bar: 12345 Example
logger := slog.New(yadu.NewHandler(os.Stdout, nil)) type body string type Ammo struct { Forweapon string Impact int Cost int Range int } type Enemy struct { Alive bool Health int Name string Body body `yaml:"-"` // not printed Ammo []Ammo } e := &Enemy{Alive: true, Health: 10, Name: "Bodo", Body: "body\nbody\n", Ammo: []Ammo{{Forweapon: "Railgun", Range: 400, Impact: 100, Cost: 100000}}, } slog.Info("info", "enemy", e, "spawn", 199) Output:
2024-01-18T02:57.41 CET INFO: info enemy: alive: true health: 10 name: Bodo ammo: - forweapon: Railgun impact: 100 cost: 100000 range: 400 spawn: 199 See example/example.go for usage.
Installation
Execute this to add the module to your project:
go get github.com/tlinden/yadu/v2 Configuration
You can tweak the behavior of the handler as any other handler by using the Options struct:
func removeTime(_ []string, a slog.Attr) slog.Attr { if a.Key == slog.TimeKey { return slog.Attr{} } return a } opts := &yadu.Options{ Level: slog.LevelDebug, ReplaceAttr: removeTime, } Pass this object to yadu.NewHandler().
Because you can pass whole structs to the logger which will be dumped using YAML, there's also a way to exclude fields from being printed:
type User struct { Id int User string Pass string `yaml:"-"` } If you're already using YAML tags for other purposes you can also just add a LogValue() method to your struct, which will be called by slog. Refer to the slog documentation how to use it.
You can also modify the time format using yadu.Options.TimeFormat.
Acknowledgements
I wrote most of the code with the help of the humane slog handler. Also helpfull was the guide to writing slog handlers.
- humane slog handler
- A Guide to Writing
slogHandlers - A Comprehensive Guide to Structured Logging in Go
LICENSE
This module is published under the terms of the BSD 3-Clause License. Please read the file LICENSE for details.
Author
Thomas von Dein <git |AT| daemon.de>