sagikazarmark/slog-shim

GitHub: sagikazarmark/slog-shim

该工具为 Go 标准库 log/slog 提供向后兼容的适配层,让库作者无需立即要求 Go 1.21 即可集成结构化日志 API。

Stars: 10 | Forks: 1

# [slog](https://pkg.go.dev/log/slog) shim [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/sagikazarmark/slog-shim/ci.yaml?style=flat-square)](https://github.com/sagikazarmark/slog-shim/actions/workflows/ci.yaml) [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/sagikazarmark/slog-shim) ![Go 版本](https://img.shields.io/badge/go%20version-%3E=1.20-61CFDD.svg?style=flat-square) [![使用 nix 构建](https://img.shields.io/badge/builtwith-nix-7d81f7?style=flat-square)](https://builtwithnix.org) Go 1.21 在标准库中引入了一个[新的结构化日志包](https://golang.org/doc/go1.21#slog):`log/slog`。 尽管许多人一直对此充满期待,但大规模的普及并不会立刻发生, 特别是因为升级到 Go 1.21 是一个决定,大多数库不会在一夜之间做出改变。 在这个包被加入标准库之前,在 [golang.org/x/exp/slog](https://pkg.go.dev/golang.org/x/exp/slog) 有一个可用的*实验性*版本。 虽然通常不建议在生产环境中使用实验性包, 但在过去几年里,这个包充当了一种 backport 包的角色, 在它们被添加到标准库之前整合了新特性(比如 `slices`、`maps` 或 `errors`)。 这个包起到了桥梁的作用,帮助库以向后兼容的方式集成 slog,而无需立即将其 Go 版本要求更新到 1.21。在 Go 1.21(及更高版本)上,它作为 `log/slog` 的直接替代品,而在 1.21 以下的版本中,它会回退到 `golang.org/x/exp/slog`。 **它如何实现向后兼容性?** 尽管对于放弃对旧 Go 版本的支持是否被视为向后兼容尚未达成共识,但大多数人似乎认为是这样的。 (我没有科学的证据来证明这一点,但这是基于在不同渠道与不同的人交流得出的结论。) 这个包遵循对向后兼容性的这种解释。在 Go 1.21 上,shim 使用类型别名来提供与 `slog/log` 相同的 API。 一旦库将其版本要求升级到 Go 1.21,它就应该能够丢弃这个 shim 并直接使用 `log/slog`。 对于较旧的 Go 版本,移除 shim 后库可能会变得不稳定。 然而,由于这些较旧的版本不再受支持,向后兼容性的承诺依然成立。 ## 安装 ``` go get github.com/sagikazarmark/slog-shim ``` ## 用法 将此包导入到您的库中,并在您的公共 API 中使用它: ``` package mylib import slog "github.com/sagikazarmark/slog-shim" func New(logger *slog.Logger) MyLib { // ... } ``` 使用该库时,客户端可以使用 `log/slog`(在 Go 1.21 上)或 `golang.org/x/exp/slog`(在 Go 1.21 以下版本): ``` package main import "log/slog" // OR import "golang.org/x/exp/slog" mylib.New(slog.Default()) ``` **确保使用者清楚您的 API 在不同的 Go 版本上表现不同。** 一旦您将 Go 版本要求提升到 Go 1.21,您就可以从代码中彻底移除 shim: ``` package mylib - import slog "github.com/sagikazarmark/slog-shim" + import "log/slog" func New(logger *slog.Logger) MyLib { // ... } ``` ## 许可证 该项目采用 [BSD 风格的许可证](LICENSE)。
标签:EVTX分析, Go, Ruby工具, slog, SOC Prime, 兼容性垫片, 开发工具, 日志, 日志审计