上一篇文章讲解了 log/slog 包中的 LogValuer 和日志记录函数的正确包装方法,本文详细讲解一下 slog.Record 结构体的使用方法和需要注意的点。
Record 类型用来保存日志事件的信息,定义如下:
- type Record struct {
- Time time.Time
- Message string
- Level Level
- PC uintptr
- front [nAttrsInline]Attr
- nFront int
- back []Attr
- }
有如下几个方法:
可以使用 slog.NewRecord 函数创建一个 Record 对象,使用 Record 记录日志的示例代码如下:
- package main
-
- import (
- "context"
- "log/slog"
- "os"
- "time"
- )
-
- func main() {
- logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
- r := slog.NewRecord(time.Now(), slog.LevelInfo, "test", 1)
- r.Add("title", "路多辛的博客")
- _ = logger.Handler().Handle(context.Background(), r)
- }
运行程序,输出结果如下:
time=2023-10-17T21:01:12.041+08:00 level=INFO msg=test title=路多辛的博客
在日常的使用场景中,会有这么一种情况,首先创建一个基础的 Record 对象,然后会使用不同的 Handler 来基于这个对象分别做不同的处理。这种场景下,需要先调用 Clone 方法克隆一份 Record 对象的副本,然后传递给其他 Handler 做处理。这样对副本的修改不会影响到原本的对象,对原本对象的修改也不会影响到副本,示例代码如下:
- package main
-
- import (
- "context"
- "log/slog"
- "os"
- "time"
- )
-
- func main() {
- logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
- r := slog.NewRecord(time.Now(), slog.LevelInfo, "test", 1)
- r.Add("title", "路多辛的博客")
- _ = logger.Handler().Handle(context.Background(), r)
-
- r2 := r.Clone()
- r2.Add("subTitle", "路多辛的所思所想")
- l := slog.NewJSONHandler(os.Stdout, nil)
- _ = l.Handle(context.Background(), r2)
- }
运行程序输出结果如下:
- time=2023-10-17T21:24:23.588+08:00 level=INFO msg=test title=路多辛的博客
- {"time":"2023-10-17T21:24:23.588517+08:00","level":"INFO","msg":"test","title":"路多辛的博客","subTitle":"路多辛的所思所想"}
本文讲解了 slog.Record 结构体的简单使用方法和使用时需要注意的点,对应的方法使用起来也都比较简单,不再逐个讲解,可以自己去尝试使用。