• Golang 结构化日志包 log/slog 详解(六):slog.Record


    上一篇文章讲解了 log/slog 包中的 LogValuer 和日志记录函数的正确包装方法,本文详细讲解一下 slog.Record 结构体的使用方法和需要注意的点。

    slog.Record

    Record 类型用来保存日志事件的信息,定义如下:

    1. type Record struct {
    2. Time time.Time
    3. Message string
    4. Level Level
    5. PC uintptr
    6. front [nAttrsInline]Attr
    7. nFront int
    8. back []Attr
    9. }

    有如下几个方法:

    • func (r Record) Clone() Record,返回一个不共享状态的副本,Record 和其克隆副本都可以被修改并且不会相互干扰。
    • func (r Record) NumAttrs() int,返回日志记录中属性的个数。
    • func (r Record) Attrs(f func(Attr) bool),使用函数 f 作用于日志记录中的每个属性,如果 f 返回 false,则停止迭代。
    • func (r *Record) AddAttrs(attrs ...Attr),将给定的属性追加到日志记录的属性列表中。
    • func (r *Record) Add(args ...any),将参数转换为 Logger.Log 中描述的 Attrs,然后将Attrs 追加到日志记录中的 Attrs 列表。
    • func (r Record) source() *Source,返回日志事件的 Source。

    使用示例

    可以使用 slog.NewRecord 函数创建一个 Record 对象,使用 Record 记录日志的示例代码如下:

    1. package main
    2. import (
    3. "context"
    4. "log/slog"
    5. "os"
    6. "time"
    7. )
    8. func main() {
    9. logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    10. r := slog.NewRecord(time.Now(), slog.LevelInfo, "test", 1)
    11. r.Add("title", "路多辛的博客")
    12. _ = logger.Handler().Handle(context.Background(), r)
    13. }

    运行程序,输出结果如下:

    time=2023-10-17T21:01:12.041+08:00 level=INFO msg=test title=路多辛的博客

    在日常的使用场景中,会有这么一种情况,首先创建一个基础的 Record 对象,然后会使用不同的 Handler 来基于这个对象分别做不同的处理。这种场景下,需要先调用 Clone 方法克隆一份 Record 对象的副本,然后传递给其他 Handler 做处理。这样对副本的修改不会影响到原本的对象,对原本对象的修改也不会影响到副本,示例代码如下:

    1. package main
    2. import (
    3. "context"
    4. "log/slog"
    5. "os"
    6. "time"
    7. )
    8. func main() {
    9. logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    10. r := slog.NewRecord(time.Now(), slog.LevelInfo, "test", 1)
    11. r.Add("title", "路多辛的博客")
    12. _ = logger.Handler().Handle(context.Background(), r)
    13. r2 := r.Clone()
    14. r2.Add("subTitle", "路多辛的所思所想")
    15. l := slog.NewJSONHandler(os.Stdout, nil)
    16. _ = l.Handle(context.Background(), r2)
    17. }

    运行程序输出结果如下:

    1. time=2023-10-17T21:24:23.588+08:00 level=INFO msg=test title=路多辛的博客
    2. {"time":"2023-10-17T21:24:23.588517+08:00","level":"INFO","msg":"test","title":"路多辛的博客","subTitle":"路多辛的所思所想"}

    小结

    本文讲解了 slog.Record 结构体的简单使用方法和使用时需要注意的点,对应的方法使用起来也都比较简单,不再逐个讲解,可以自己去尝试使用。

  • 相关阅读:
    SystemVerilog Assertions应用指南 第一章(1.25章节 “throughout”运算符)
    AWX+gitlab
    程序员缺乏经验的 7 种表现,你中了几个?
    基因对静息态脑功能网络的影响
    【2 操作系统的结构】
    自然语言处理学习笔记(十二)————语言模型
    .NET ADO.NET和数据库的连接、 数据库连接池
    一篇玩转mybatis-plus框架的详细讲解(入门必备)
    Dubbo 2.6.1升级
    Centos 8 安装 nginx
  • 原文地址:https://blog.csdn.net/luduoyuan/article/details/133894668