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分析, 日志审计