golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介
上一篇文章講解了log/slog 包中的 LogValuer 和日志記錄函數(shù)的正確包裝方法,本文詳細(xì)講解一下 slog.Record 結(jié)構(gòu)體的使用方法和需要注意的點(diǎn)。
slog.Record
Record 類型用來(lái)保存日志事件的信息,定義如下:
type Record struct { Time time.Time Message string Level Level PC uintptr front [nAttrsInline]Attr nFront int back []Attr }
有如下幾個(gè)方法:
func (r Record) Clone() Record,返回一個(gè)不共享狀態(tài)的副本,Record 和其克隆副本都可以被修改并且不會(huì)相互干擾。
func (r Record) NumAttrs() int,返回日志記錄中屬性的個(gè)數(shù)。
func (r Record) Attrs(f func(Attr) bool),使用函數(shù) f 作用于日志記錄中的每個(gè)屬性,如果 f 返回 false,則停止迭代。
func (r *Record) AddAttrs(attrs ...Attr),將給定的屬性追加到日志記錄的屬性列表中。
func (r *Record) Add(args ...any),將參數(shù)轉(zhuǎn)換為 Logger.Log 中描述的 Attrs,然后將Attrs 追加到日志記錄中的 Attrs 列表。
func (r Record) source() *Source,返回日志事件的 Source。
使用示例
可以使用 slog.NewRecord 函數(shù)創(chuàng)建一個(gè) Record 對(duì)象,使用 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) }
運(yùn)行程序,輸出結(jié)果如下:
time=2023-10-17T21:01:12.041+08:00 level=INFO msg=test title=路多辛的博客
在日常的使用場(chǎng)景中,會(huì)有這么一種情況,首先創(chuàng)建一個(gè)基礎(chǔ)的 Record 對(duì)象,然后會(huì)使用不同的 Handler 來(lái)基于這個(gè)對(duì)象分別做不同的處理。這種場(chǎng)景下,需要先調(diào)用 Clone 方法克隆一份 Record 對(duì)象的副本,然后傳遞給其他 Handler 做處理。這樣對(duì)副本的修改不會(huì)影響到原本的對(duì)象,對(duì)原本對(duì)象的修改也不會(huì)影響到副本,示例代碼如下:
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) }
運(yùn)行程序輸出結(jié)果如下:
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":"路多辛的所思所想"}
小結(jié)
本文講解了 slog.Record 結(jié)構(gòu)體的簡(jiǎn)單使用方法和使用時(shí)需要注意的點(diǎn),對(duì)應(yīng)的方法使用起來(lái)也都比較簡(jiǎn)單,不再逐個(gè)講解,可以自己去嘗試使用。
到此這篇關(guān)于golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介的文章就介紹到這了,更多相關(guān)go結(jié)構(gòu)化日志slog內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go中的new()和make()函數(shù)區(qū)別及底層原理詳解
這篇文章主要為大家介紹了Go中的new()和make()函數(shù)區(qū)別及底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09gin自定義中間件解決requestBody不可重讀(請(qǐng)求體取值)
這篇文章主要介紹了gin自定義中間件解決requestBody不可重讀,確??刂破髂軌颢@取請(qǐng)求體值,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Golang的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù)的整理介紹
這篇文章主要介紹了Go語(yǔ)言的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù),主要用來(lái)實(shí)現(xiàn)與操作系統(tǒng)的交互功能,需要的朋友可以參考下2015-10-10golangci-lint安裝與Goland集成問(wèn)題
這篇文章主要介紹了golangci-lint安裝與Goland集成,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-12-12golang如何部署到服務(wù)器及應(yīng)注意問(wèn)題解析
這篇文章主要為大家介紹了golang如何部署到服務(wù)器及應(yīng)注意問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01