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
[](https://github.com/sagikazarmark/slog-shim/actions/workflows/ci.yaml)
[](https://pkg.go.dev/mod/github.com/sagikazarmark/slog-shim)

[](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, 兼容性垫片, 开发工具, 日志, 日志审计