golang结构化日志log/slog包之slog.Record的用法简介

 更新时间:2023年10月18日 08:48:39   作者:路多辛  
这篇文章主要为大家详细介绍了golang结构化日志log/slog包中slog.Record结构体的使用方法和需要注意的点,文中的示例代码讲解详细,需要的可以学习一下

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

slog.Record

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

type Record struct {
    Time time.Time
    Message string
    Level Level
    PC uintptr
    front [nAttrsInline]Attr
    nFront int
    back []Attr
}

有如下几个方法:

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 记录日志的示例代码如下:

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 结构体的简单使用方法和使用时需要注意的点,对应的方法使用起来也都比较简单,不再逐个讲解,可以自己去尝试使用。

到此这篇关于golang结构化日志log/slog包之slog.Record的用法简介的文章就介绍到这了,更多相关go结构化日志slog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang判断字符串是是否包含另一字符串的示例代码

    golang判断字符串是是否包含另一字符串的示例代码

    在Go语言中,可以使用strings.Contains()函数来判断一个字符串是否包含另一个字符串,该函数接受两个参数:要搜索的字符串和要查找的子字符串,如果子字符串存在于要搜索的字符串中,则返回true,否则返回false,下面通过示例详细介绍,感兴趣的朋友一起看看吧
    2023-09-09
  • GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    这篇文章主要为大家介绍了GoFrame gredis干货DoVar Conn连接对象自动序列化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 一文初探Go语言中的reflect反射包

    一文初探Go语言中的reflect反射包

    这篇文章主要和大家分享一下Go语言中的reflect反射包,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-12-12
  • Go语言中的方法、接口和嵌入类型详解

    Go语言中的方法、接口和嵌入类型详解

    这篇文章主要介绍了Go语言中的方法、接口和嵌入类型详解,本文分别对它们做了详细讲解,需要的朋友可以参考下
    2014-10-10
  • Go Error 嵌套实现创建方式

    Go Error 嵌套实现创建方式

    这篇文章主要介绍了Go Error 嵌套到底是怎么实现的?大家都知道创建error有两种方式分别是errors.new()另一种是fmt.errorf(),本文通过详细例子给大家介绍,需要的朋友可以参考下
    2022-01-01
  • 基于Go语言实现分金币游戏

    基于Go语言实现分金币游戏

    这篇文章主要为大家详细介绍了如何利用Go语言实现分金币游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言ORM框架构造查询条件示例详解

    Go语言ORM框架构造查询条件示例详解

    这篇文章主要为大家介绍了Go语言ORM框架构造查询条件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang Map简介以及底层原理

    Golang Map简介以及底层原理

    这篇文章主要介绍了Golang Map简介以及底层原理的相关资料,Go语言提供的map是一种键值对存储结构,支持基本操作如len、delete等,map是非线程安全的,可用sync.Mutex确保并发安全,为高效查找和插入,需要的朋友可以参考下
    2024-10-10
  • Golang中单引号、双引号、反引号的实现

    Golang中单引号、双引号、反引号的实现

    Go语言中单引号表示rune类型,双引号用于字符串支持转义,反引号保留原始内容且支持多行不转义,三者区分关键在于字符处理方式与转义规则,下面就来介绍一下
    2025-06-06
  • go如何终止多个for select循环嵌套的方法

    go如何终止多个for select循环嵌套的方法

    当您想从嵌套循环中中断,从select内部终止循环时,标记的中断非常有用,本文主要介绍了go如何终止多个for select循环嵌套的方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论