- stderr and null drivers; per-component levels from log.components - SUMMER_LOG__ overrides parse as strings and overlay the defaults key by key - Validation names the key: driver, format, level, days, stack children and cycles, daily path outside the root - summer new writes config/log.yaml (stack of console and daily, river warn, http info) - docs/services/logging.md: channels, config/log.yaml, component loggers, daily files, redaction - Log keys in the configuration docs; ExampleFor backs the docs snippet
35 lines
973 B
Go
35 lines
973 B
Go
package diary_test
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"os"
|
|
|
|
"git.golem15.com/golem15/summercms/modules/diary"
|
|
)
|
|
|
|
// blogLog is the component logger of a blog plugin, created once in a
|
|
// package var block, before diary is set up.
|
|
var blogLog = diary.For("blog")
|
|
|
|
func ExampleFor() {
|
|
// Before diary.Setup runs, records go to the process default logger.
|
|
// This one drops the time so the output is stable.
|
|
previous := slog.Default()
|
|
defer slog.SetDefault(previous)
|
|
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
|
|
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
|
|
if len(groups) == 0 && a.Key == slog.TimeKey {
|
|
return slog.Attr{}
|
|
}
|
|
return a
|
|
},
|
|
})))
|
|
|
|
// After diary.Setup the same record reaches the configured channels and
|
|
// passes log.components.blog, else log.level.
|
|
blogLog.InfoContext(context.Background(), "post published", "id", 7)
|
|
// Output:
|
|
// level=INFO msg="post published" component=blog id=7
|
|
}
|