A human readable slog.Handler using YAML to show attrs
T. von Dein 6fed3af065
All checks were successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
move to codeberg (#15)
2025-12-06 20:56:16 +01:00
.woodpecker move to codeberg (#15) 2025-12-06 20:56:16 +01:00
example move to codeberg (#15) 2025-12-06 20:56:16 +01:00
.gitignore fix example 2024-01-18 18:48:32 +01:00
.goreleaser.yaml move to codeberg (#15) 2025-12-06 20:56:16 +01:00
go.mod move to codeberg (#15) 2025-12-06 20:56:16 +01:00
go.sum move to codeberg (#15) 2025-12-06 20:56:16 +01:00
handler.go move to codeberg (#15) 2025-12-06 20:56:16 +01:00
handler_test.go move to codeberg (#15) 2025-12-06 20:56:16 +01:00
LICENSE Initial commit 2024-01-18 14:59:59 +01:00
Makefile fix #10: check group length before manipulation 2024-02-10 13:17:57 +01:00
Makefile.dist move to codeberg (#15) 2025-12-06 20:56:16 +01:00
README.md move to codeberg (#15) 2025-12-06 20:56:16 +01:00

status-badge Go Report Card License GoDoc

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.

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>