Go slog 包:开启结构化日志的奇妙之旅

go 1.21.0 版本引入了一个新的包 log/slog,该包提供了结构化日志的功能。相比于普通的日志,结构化日志更受欢迎,因为它具有更高的可读性,并且在处理、分析和搜索等方面具有显著的优势。

slog 包提供了结构化日志,其中的日志记录包含了 消息、严重级别 以及 各种其他属性,这些属性以 键值对 的形式表示。

slog 包的主要功能如下所示:

  • 结构化日志
  • 日志严重级别
  • 日志自定义处理
  • 日志分组

使用

示例

1
2
3
4
5
slog.InfoContext(ctx, "message")

slog.Info("hello", slog.Int("count", 3))
slog.Info("hello", "count", 3)
// 2022/11/08 15:28:26 INFO hello count=3

Logger 的创建

默认情况下,使用 slog 包函数输出日志,仅仅是普通的文本格式,若想实现 JSON 或者 key=value 的格式输出,需要使用 slog.New() 函数创建 Logger 实例,使用该函数时需要传入一个 slog.Handler 的实现,slog 包提供两个实现:TextHandler 和 JsonHandler。

TextHandler 处理器

TextHandler 是一个日志记录处理器,它将记录以一系列键值对的形式写入到一个 io.Writer 中。每个键值对都以 key=value 的形式表示,并且它们之间用空格分隔。

1
2
3
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
logger.Info("hello", "count", 3)
// time=2022-11-08T15:28:26.000-05:00 level=INFO msg=hello count=3

JsonHandler 处理器

1
2
3
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("hello", "count", 3)
// {"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3}

参考