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

相关推荐
i220818 Faiz Ul几秒前
民谣网站|基于Springboot的民谣网站管理系统(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·民谣网站
z落落1 分钟前
C# 继承基础详解(代码实战+权限规则)
java·开发语言
techdashen2 分钟前
你想在 Rust 中实现动态库热重载?
开发语言·chrome·rust
不会C语言的男孩2 分钟前
C++ Primer 第5章:语句
开发语言·c++
Oneslide3 分钟前
windows cmd输入输出都很卡
后端
酉鬼女又兒5 分钟前
零基础入门计算机网络:从基本概念到核心交换技术
开发语言·计算机网络·考研·职场和发展·php
爱喝水的鱼丶8 分钟前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第三篇:SAP ALV 报表样式定制:字段布局与交互功能配置
服务器·开发语言·学习·交互·sap·abap
chao1898448 分钟前
基于SIFT和SURF特征的图像配准(MATLAB)
开发语言·matlab
摇滚侠11 分钟前
JDBC 基础到高级一套通关!基础篇 00-15
java·开发语言·数据库
ihuyigui18 分钟前
国际企业办公短信接口
前端·后端·架构