logger
Adapter-based, slog-native structured logging with sampling, redaction, OpenTelemetry and rotation.
go get github.com/ubgo/logger
- Language
- Go
- Go version
- 1.24
- Core deps
- 0 direct
- Latest tag
- none
- License
- Apache-2.0
- Go modules
- 8
How it fits together
Highlights from the README
- ✅ slog-native — it is a correct
slog.Handler(passes the standard library’stesting/slogtest). The entire slog ecosystem composes on top. - ✅ Zero-allocation typed hot path (CI-enforced), competitive with
zapandzerolog. - ✅ One extension seam — a processor pipeline. Redaction, sampling, enrichment, dedup are all the same concept.
- ✅ Batteries included — rotation, redaction, sampling, OTEL correlation, FingersCrossed, audit, network/cloud sinks — built in, not 50 dependencies.
- ✅ Drop-in migration from zap, zerolog, logrus, std
log, andlogr.
Code from the README
package main
import logger "github.com/ubgo/logger"
func main() {
log := logger.New() // JSON to stderr at Info
defer log.Close()
log.Info("server started", logger.String("addr", ":8080"), logger.Int("pid", 4242))
}log := logger.Development() // pretty, colored, Debug, caller — for local dev
// or
log := logger.Production() // JSON, Info, async, sampled — for services
defer log.Close()import "log/slog"
slog.SetDefault(log.NewSlog())
slog.Info("now every slog call in your deps flows through ubgo/logger")log := logger.New(
logger.WithLevel(logger.LevelInfo),
logger.WithProcessors(
logger.NewPathRedactor(logger.Mask, "[REDACTED]", "*.password", "*.token"),
logger.NewSampleProcessor(100, 100), // first 100, then 1/100 — never drops ERROR
),
logger.WithTransport(logger.NewDisruptorTransport(
logger.NewWriterSink(os.Stderr, logger.NewJSONEncoder(), logger.LevelInfo),
8192, logger.DropNewest,
)),
)
defer log.Close() // drains the async ringFrom the logger README.
At a glance (from the README)
| From | How | Module |
|---|---|---|
log/slog | slog.SetDefault(log.NewSlog()) | core (no extra dep) |
std log | logger.RedirectStdLog(log, logger.LevelInfo) | core |
uber-go/zap | zaplogger.New(core, zapcore.InfoLevel) | contrib/zap |
sirupsen/logrus | logruslogger.Attach(logrusLogger, core) | contrib/logrus |
rs/zerolog | zerologlogger.New(zl, logger.LevelInfo) | contrib/zerolog |
phuslu/log | phulogger.New(pl, logger.LevelInfo) | contrib/phuslu |
go-logr/logr | logrlogger.New(core) | contrib/logr |