上一篇文章介绍了推出 log/slog 包的背景、log/slog 包的简单介绍和使用,简单使用了 Info 函数,例如:
- package main
-
- import (
- "log/slog"
- )
-
- func main() {
- slog.Info("hello", "标题", "路多辛的博客")
- }
这段代码输出的内容如下:
2023/09/08 22:33:16 INFO hello 标题=路多辛的博客
默认情况下,输出的日志格式是普通的 text 格式,这种格式并不是最适合日志系统的格式。日志系统一般采用 SON 格式或者 key=value 类型的文本格式,log/slog 包也提供了对应功能。
log/slog 包实现不同的输出格式是使用 Handler 来实现的,除了默认的 Handler, 还提供了以 JSON 格式输出的 JSONHandler 和以 key=value 格式输出的 TextHandler。如果要使用这两种 Handler,需要显式创建出来,示例代码如下:
- package main
-
- import (
- "log/slog"
- "os"
- )
-
- func main() {
- loggerText := slog.New(slog.NewTextHandler(os.Stderr, nil))
- loggerText.Info("hello", "标题", "路多辛的博客")
-
- loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, nil))
- loggerJSON.Info("hello", "标题", "路多辛的博客")
- }
上述代码分别创建了一个使用 TextHandler 的 Logger 实例和一个使用 JSONHandler 的 Logger 实例,运行结果如下:
- time=2023-09-09T20:17:11.845+08:00 level=INFO msg=hello 标题=路多辛的博客
- {"time":"2023-09-09T20:17:11.846302+08:00","level":"INFO","msg":"hello","标题":"路多辛的博客"}
也可以实现自己的 Handler,关于这块知识接下来的文章会专门介绍。
创建 TextHandler 和 JSONHandler 对象时都可以接受 *HandlerOptions 类型的参数,用于设置日志级别、是否显示日志调用的源文件和行信息以及在记录属性之前修改属性。看个示例:
- package main
-
- import (
- "log/slog"
- "os"
- )
-
- func main() {
- opts := slog.HandlerOptions{
- AddSource: true,
- }
- loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
- loggerJSON.Info("hello", "标题", "路多辛的博客")
- }
创建 JSONHandler 时,设置显示调用的源文件和行信息,运行看下结果:
{"time":"2023-09-09T20:38:10.868172+08:00","level":"INFO","source":{"function":"main.main","file":"/Users/ning/projects/go/workspace/hello/bin.go","line":13},"msg":"hello","标题":"路多辛的博客"}
可以看到通过 Info 方法输出的日志信息里面包含了打印日志的代码文件以及在源代码文件中的位置。
可以通过 SetDefault 函数设置默认的 Logger 类型,设置默认 Logger 后打印日志的顶级函数,例如 Info、Warn、Error 等都会按照新的格式打印日志,看个示例:
- package main
-
- import (
- "log/slog"
- "os"
- )
-
- func main() {
- loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
- slog.SetDefault(loggerJSON)
- slog.Info("hello", "标题", "路多辛的博客")
- }
运行看下输出结果:
{"time":"2023-09-09T21:14:15.213592+08:00","level":"INFO","msg":"hello","标题":"路多辛的博客"}
可以看到,使用 SetDefault 函数将默认 Logger 设置为了 loggerJSON,再调用 Info 函数后,就按照 JSON 格式打印日志了。