go-logr/zapr

GitHub: go-logr/zapr

将 Uber Zap 日志库适配为 logr 接口实现,同时兼容标准库 slog handler,打通三套日志体系。

Stars: 137 | Forks: 32

# Zapr :zap: 一个使用 [Zap](https://github.com/uber-go/zap) 的 [logr](https://github.com/go-logr/logr) 实现。也可作为 [slog](https://pkg.go.dev/log/slog) handler 使用。 ## 用法 通过 logr: ``` package main import ( "fmt" "go.uber.org/zap" "github.com/go-logr/logr" "github.com/go-logr/zapr" ) func main() { var log logr.Logger zapLog, err := zap.NewDevelopment() if err != nil { panic(fmt.Sprintf("who watches the watchmen (%v)?", err)) } log = zapr.NewLogger(zapLog) log.Info("Logr in action!", "the answer", 42) } ``` 通过 slog: ``` package main import ( "fmt" "log/slog" "github.com/go-logr/logr/slogr" "github.com/go-logr/zapr" "go.uber.org/zap" ) func main() { var log *slog.Logger zapLog, err := zap.NewDevelopment() if err != nil { panic(fmt.Sprintf("who watches the watchmen (%v)?", err)) } log = slog.New(slogr.NewSlogHandler(zapr.NewLogger(zapLog))) log.Info("Logr in action!", "the answer", 42) } ``` ## 提高详细程度 Zap 使用语义化命名的级别进行日志记录(`DebugLevel`、`InfoLevel`、 `WarningLevel` 等)。Logr 使用任意的数字级别。默认情况下,logr 的 `V(0)` 对应 zap 的 `InfoLevel`,而 `V(1)` 对应 zap 的 `DebugLevel`(数值上为 -1)。Zap 没有比 `DebugLevel` 更详细的命名级别,但可以对其进行模拟。 从 zap v1.19.0 开始,你可以在你的设置代码中执行如下操作: ``` zc := zap.NewProductionConfig() zc.Level = zap.NewAtomicLevelAt(zapcore.Level(-2)) z, err := zc.Build() if err != nil { // ... } log := zapr.NewLogger(z) ``` Zap 的级别随着数字变小而变得更详细,随着数字变大而变得更重要 (`DebugLevel` 是 -1,`InfoLevel` 是 0,`WarnLevel` 是 1, 以此类推)。 上述代码片段中的 `-2` 意味着 `log.V(2).Info()` 调用将被激活。 `-3` 将启用 `log.V(3).Info()`,以此类推。请注意,zap 的级别是 `int8`, 这意味着你能赋予它的最详细的级别是 -128。zapr 实现会将大于 127 的 `V()` 级别限制在 127,因此将 zap 级别设置为 -128 实际上意味着“激活所有日志”。 ## 实现细节 在大多数情况下,Zap 中的概念与 logr 中的概念直接对应。 与 Zap 不同,所有的字段*必须*采用 sugared fields 的形式—— 在 key 位置传递强类型的 Zap 字段给任何 日志记录方法(`Log`、`Error`)都是非法的。 zapr 的 `logr.LogSink` 实现也实现了 `logr.SlogHandler`。这 使得 `slogr.NewSlogHandler` 能够提供一个 `slog.Handler`,直接将 参数传递给 zapr。无论使用哪种前端 API,zapr 都会处理特殊的 slog 值(Group、 LogValuer)。
标签:EVTX分析, 日志审计