feat(log): add slog-backed Logger type (#22347)
This commit is contained in:
parent
bf58aaf2bf
commit
7262cf3346
@ -25,6 +25,7 @@ Each entry must include the Github issue reference in the following format:
|
||||
### Improvements
|
||||
|
||||
* [#22233](https://github.com/cosmos/cosmos-sdk/pull/22233) Use sonic json library for faster json handling
|
||||
* [#22347](https://github.com/cosmos/cosmos-sdk/pull/22347) Add cosmossdk.io/log/slog to allow using a standard library log/slog-backed logger.
|
||||
|
||||
## [v1.4.1](https://github.com/cosmos/cosmos-sdk/releases/tag/log/v1.4.1) - 2024-08-16
|
||||
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
# Log
|
||||
|
||||
The `cosmossdk.io/log` provides a zerolog logging implementation for the Cosmos SDK and Cosmos SDK modules.
|
||||
|
||||
To use a logger wrapping an instance of the standard library's `log/slog` package, use `cosmossdk.io/log/slog`.
|
||||
|
||||
50
log/slog/logger.go
Normal file
50
log/slog/logger.go
Normal file
@ -0,0 +1,50 @@
|
||||
// Package slog contains a Logger type that satisfies [cosmossdk.io/log.Logger],
|
||||
// backed by a standard library [*log/slog.Logger].
|
||||
package slog
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"cosmossdk.io/log"
|
||||
)
|
||||
|
||||
var _ log.Logger = Logger{}
|
||||
|
||||
// Logger satisfies [log.Logger] with logging backed by
|
||||
// an instance of [*slog.Logger].
|
||||
type Logger struct {
|
||||
log *slog.Logger
|
||||
}
|
||||
|
||||
// NewCustomLogger returns a Logger backed by an existing slog.Logger instance.
|
||||
// All logging methods are called directly on the *slog.Logger;
|
||||
// therefore it is the caller's responsibility to configure message filtering,
|
||||
// level filtering, output format, and so on.
|
||||
func NewCustomLogger(log *slog.Logger) Logger {
|
||||
return Logger{log: log}
|
||||
}
|
||||
|
||||
func (l Logger) Info(msg string, keyVals ...any) {
|
||||
l.log.Info(msg, keyVals...)
|
||||
}
|
||||
|
||||
func (l Logger) Warn(msg string, keyVals ...any) {
|
||||
l.log.Warn(msg, keyVals...)
|
||||
}
|
||||
|
||||
func (l Logger) Error(msg string, keyVals ...any) {
|
||||
l.log.Error(msg, keyVals...)
|
||||
}
|
||||
|
||||
func (l Logger) Debug(msg string, keyVals ...any) {
|
||||
l.log.Debug(msg, keyVals...)
|
||||
}
|
||||
|
||||
func (l Logger) With(keyVals ...any) log.Logger {
|
||||
return Logger{log: l.log.With(keyVals...)}
|
||||
}
|
||||
|
||||
// Impl returns l's underlying [*slog.Logger].
|
||||
func (l Logger) Impl() any {
|
||||
return l.log
|
||||
}
|
||||
92
log/slog/logger_test.go
Normal file
92
log/slog/logger_test.go
Normal file
@ -0,0 +1,92 @@
|
||||
package slog_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
stdslog "log/slog"
|
||||
"testing"
|
||||
|
||||
"cosmossdk.io/log/slog"
|
||||
)
|
||||
|
||||
func TestSlog(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
h := stdslog.NewJSONHandler(&buf, &stdslog.HandlerOptions{
|
||||
Level: stdslog.LevelDebug,
|
||||
})
|
||||
logger := slog.NewCustomLogger(stdslog.New(h))
|
||||
|
||||
type logLine struct {
|
||||
Level string `json:"level"`
|
||||
Msg string `json:"msg"`
|
||||
Num int `json:"num"`
|
||||
}
|
||||
|
||||
var line logLine
|
||||
|
||||
logger.Debug("Message one", "num", 1)
|
||||
if err := json.Unmarshal(buf.Bytes(), &line); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want := (logLine{
|
||||
Level: stdslog.LevelDebug.String(),
|
||||
Msg: "Message one",
|
||||
Num: 1,
|
||||
}); want != line {
|
||||
t.Fatalf("unexpected log record: want %v, got %v", want, line)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Info("Message two", "num", 2)
|
||||
if err := json.Unmarshal(buf.Bytes(), &line); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want := (logLine{
|
||||
Level: stdslog.LevelInfo.String(),
|
||||
Msg: "Message two",
|
||||
Num: 2,
|
||||
}); want != line {
|
||||
t.Fatalf("unexpected log record: want %v, got %v", want, line)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Warn("Message three", "num", 3)
|
||||
if err := json.Unmarshal(buf.Bytes(), &line); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want := (logLine{
|
||||
Level: stdslog.LevelWarn.String(),
|
||||
Msg: "Message three",
|
||||
Num: 3,
|
||||
}); want != line {
|
||||
t.Fatalf("unexpected log record: want %v, got %v", want, line)
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
logger.Error("Message four", "num", 4)
|
||||
if err := json.Unmarshal(buf.Bytes(), &line); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want := (logLine{
|
||||
Level: stdslog.LevelError.String(),
|
||||
Msg: "Message four",
|
||||
Num: 4,
|
||||
}); want != line {
|
||||
t.Fatalf("unexpected log record: want %v, got %v", want, line)
|
||||
}
|
||||
|
||||
wLogger := logger.With("num", 5)
|
||||
buf.Reset()
|
||||
wLogger.Info("Using .With")
|
||||
|
||||
if err := json.Unmarshal(buf.Bytes(), &line); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if want := (logLine{
|
||||
Level: stdslog.LevelInfo.String(),
|
||||
Msg: "Using .With",
|
||||
Num: 5,
|
||||
}); want != line {
|
||||
t.Fatalf("unexpected log record: want %v, got %v", want, line)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user