在 Go1.21.0 开始,标准库提供了结构化日志包log/slog
,这是社区讨论多年的问题,现在流行的开源日志库很多也很好用,在官方博客Structured Logging with slog 也说明了,此举并不是要排挤开源日志库,而是为了简化依赖
由于有许多结构化日志包可供选择,大型程序通常会通过其依赖项包含多个日志包。主程序可能必须配置这些日志包中的每一个,以便日志输出保持一致:它都以相同的格式到达同一个地方。通过在标准库中包含结构化日志,我们可以提供一个所有其他结构化日志包可以共享的通用框架。
而 slog
也是广泛吸取了各开源日志库的优点,在使用过程中会感觉很熟悉,说实话一个编程语言最好只有一个最受欢迎的日志库,这样你就不用纠结该使用哪个,而且各个库的使用方法也不一样,说实话心智负担过重,如果能统一就更好,各个框架或项目使用同样的日志库这是最理想的。
func logInfo() {
// 2024/12/23 09:55:19 INFO hello, world name=Alice age=25
slog.Info("hello, world", "name", "Alice", "age", 25)
l := slog.Default()
// 2024/12/23 09:55:19 INFO hello, world name=Alice age=25
l.Info("hello, world", "name", "Alice", "age", 25)
textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
// time=2024-12-23T09:55:19.440+08:00 level=INFO msg="hello, world" name=Alice age=25
textLogger.Info("hello, world", "name", "Alice", "age", 25)
jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
// {"time":"2024-12-23T09:55:19.4403599+08:00","level":"INFO","msg":"hello, world","name":"Alice","age":25}
jsonLogger.Info("hello, world", "name", "Alice", "age", 25)
// {"time":"2024-12-23T09:55:19.440883+08:00","level":"WARN","msg":"hello, world","name":"Alice","age":25}
jsonLogger.LogAttrs(context.Background(), slog.LevelWarn, "hello, world", slog.String("name", "Alice"), slog.Int("age", 25))
jsonLogger = jsonLogger.With("name", "Alice", "age", 25)
// {"time":"2024-12-23T09:55:19.440883+08:00","level":"ERROR","msg":"hello, world","name":"Alice","age":25}
jsonLogger.Error("hello, world")
}
接口文档:https://pkg.go.dev/log/slog