Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫(kù)log/slog使用詳解
介紹
在 Go 語(yǔ)言項(xiàng)目開(kāi)發(fā)中,我們通常需要查看日志來(lái)調(diào)試程序,所以日志的快捷搜索和過(guò)濾就會(huì)至關(guān)重要。
因?yàn)?Go 標(biāo)準(zhǔn)庫(kù)中的 log
,它不是結(jié)構(gòu)化日志格式,使用上并不方便,所以在 Go 1.21.0 中,Go 標(biāo)準(zhǔn)庫(kù)新增結(jié)構(gòu)化日志記錄包 log/slog
,它支持鍵值對(duì)格式。
本文我們介紹 log/slog
的使用方式。
log/slog 使用方式
log/slog
的默認(rèn) logger
使用的是 log
的默認(rèn) logger
,新增日志包 log/slog
和原始日志包 log
協(xié)同工作,使 log/slog
更易上手。
日志級(jí)別
log/slog
日志級(jí)別包括 Info
、Debug
、Warn
和 Error
,log/slog
為它們分別提供了函數(shù)。
示例代碼:
func main() { log.Println("This is log") slog.Debug("This is Debug Level") slog.Info("This is Info Level") slog.Warn("This is Warn Level") slog.Error("This is Error Level") }
輸出結(jié)果:
2023/10/06 11:18:04 This is log
2023/10/06 11:18:04 INFO This is Info Level
2023/10/06 11:18:04 WARN This is Warn Level
2023/10/06 11:18:04 ERROR This is Error Level
閱讀上面這段代碼,我們可以發(fā)現(xiàn) log/slog
的輸出結(jié)果和 log
的輸出結(jié)果非常相似,只是在日志時(shí)間和日志消息之間多了日志級(jí)別。
因?yàn)?nbsp;log/slog
的默認(rèn) logger
使用的是 log
的默認(rèn) logger
。
log 函數(shù)
除了上述 4 個(gè)不同日志級(jí)別的函數(shù)之外,還有一個(gè)函數(shù) log
,我們可以使用 log
函數(shù)替代上述 4 個(gè)函數(shù)。
示例代碼:
func main() { slog.Log(context.Background(), -4, "This is Debug Level") slog.Log(context.Background(), 0, "This is Info Level") slog.Log(context.Background(), 4, "This is Warn Level") slog.Log(context.Background(), 8, "This is Error Level") }
輸出結(jié)果:
2023/10/06 11:41:47 INFO This is Info Level
2023/10/06 11:41:47 WARN This is Warn Level
2023/10/06 11:41:47 ERROR This is Error Level
閱讀上面這段代碼,我們可以發(fā)現(xiàn),log
函數(shù)通過(guò)參數(shù)定義日志級(jí)別,數(shù)字越大,級(jí)別越嚴(yán)重,并且不同級(jí)別之間,預(yù)留 4 個(gè)數(shù)字,我們可以定義其他日志級(jí)別。
log
函數(shù)與 4 個(gè)分別代表不同級(jí)別的函數(shù)之間,還有另外一個(gè)區(qū)別,它的第一參數(shù)是上下文,其實(shí) 4 個(gè)分別代表不同級(jí)別的函數(shù)也對(duì)應(yīng) 4 個(gè)支持第一個(gè)參數(shù)是上下文的函數(shù),分別是 InfoContext()
、DebugContext()
、WarnContext()
和 ErrorContext
。
細(xì)心的讀者朋友們可能發(fā)現(xiàn)了,為什么輸出結(jié)果沒(méi)有 Debug
級(jí)別的日志輸出?
因?yàn)?nbsp; log/slog
的默認(rèn) logger 的默認(rèn)日志級(jí)別是 Info,如果我們想要使用日志級(jí)別 Debug,可以新建 logger,并把默認(rèn)日志級(jí)別設(shè)置為 Debug。
鍵值對(duì)
前面我們已經(jīng)說(shuō)過(guò) log/slog
支持鍵值對(duì)格式,但是上述示例代碼中并沒(méi)有體現(xiàn),接下來(lái),我們以 Info
函數(shù)為例,介紹 log/slog
怎么輸出鍵值對(duì)格式。
func main() { slog.Info("This is Info Level", "uid", 1001) }
輸出結(jié)果:
2023/10/06 11:58:07 INFO This is Info Level uid=1001
閱讀上面這段代碼,我們發(fā)現(xiàn) Info
函數(shù)中,在日志消息之后新增兩個(gè)參數(shù),分別是 uid
和 1001
,它們就是鍵值對(duì)的 key
和 value
。
Logger 修改輸出日志格式
因?yàn)?nbsp;log/slog
默認(rèn)使用 log
的默認(rèn) logger
,所以輸出格式就是我們上面看到的文本格式。
我們可以使用內(nèi)置的 Handler NewTextHandler
和 NewJSONHandler
創(chuàng)建新的 Logger
,來(lái)輸出新文本格式和 json
格式。
示例代碼:
func main() { logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) logger.Info("This is a new text Info Level", "uid", 1002) jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) jsonLogger.Info("This is a json format Info Level", "uid", 1003) }
輸出結(jié)果:
time=2023-10-06T12:19:21.676+08:00 level=INFO msg="This is a new text Info Level" uid=1002
{"time":"2023-10-06T12:19:21.676846+08:00","level":"INFO","msg":"This is a json format Info Level","uid":1003}
閱讀上面這段代碼,我們可以發(fā)現(xiàn)通過(guò)內(nèi)置 Handler 創(chuàng)建新的 Logger
,輸出新的日志格式,其中 NewTextHandler
輸出的所有內(nèi)容都是鍵值對(duì)格式,NewJSONHandler
輸出一個(gè) json
對(duì)象。
此外,我們還可以自定義 Handler,通過(guò)實(shí)現(xiàn) slog.Handler
接口,生成特定的輸出日志格式或者 wrap
另一個(gè) Handler 來(lái)豐富其功能。
總結(jié)
本文我們介紹 log/slog
的使用方式,包括日志級(jí)別和輸出日志格式。
限于篇幅,還有一些進(jìn)階用法沒(méi)有介紹,比如 LogAttrs
函數(shù),以及 NewTextHandler
和 NewJSONHandler
的方法。
感興趣的讀者朋友們,可以閱讀標(biāo)準(zhǔn)庫(kù) log/slog[1] 文檔了解更多。
參考資料
標(biāo)準(zhǔn)庫(kù) https://pkg.go.dev/log/slog
以上就是Go 1.21.0 新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫(kù)log/slog使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Go日志記錄 log/slog庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解
- Golang標(biāo)準(zhǔn)庫(kù)os/exec執(zhí)行外部命令并獲取其輸出包代碼示例
- Go標(biāo)準(zhǔn)庫(kù)strconv實(shí)現(xiàn)string類型與其他基本數(shù)據(jù)類型之間轉(zhuǎn)換
- Go 標(biāo)準(zhǔn)庫(kù)增加metrics指標(biāo)探討分析
- Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀
- go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門
- Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究
相關(guān)文章
關(guān)于go語(yǔ)言編碼需要放到src 文件夾下的問(wèn)題
這篇文章主要介紹了go語(yǔ)言編碼需要放到src 文件夾下的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10大多數(shù)Go程序員都走過(guò)的坑盤點(diǎn)解析
這篇文章主要為大家介紹了大多數(shù)Go程序員都走過(guò)的坑盤點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12golang?gorm開(kāi)發(fā)架構(gòu)及寫插件示例
這篇文章主要為大家介紹了golang?gorm開(kāi)發(fā)架構(gòu)及寫插件的詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04go使用makefile腳本編譯應(yīng)用的方法小結(jié)
makefile可以看作是make工具的腳本文件, 而make主要用來(lái)處理一系列命令。常用的比如用來(lái)編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應(yīng)用,需要的朋友可以參考下2022-08-08如何在Go語(yǔ)言中靈活運(yùn)用匿名函數(shù)和閉包
這篇文章主要為大家介紹了如何在Go語(yǔ)言中靈活運(yùn)用匿名函數(shù)和閉包實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Go 中 slice 的 In 功能實(shí)現(xiàn)探索
這篇文章主要介紹了Go 中 slice 的 In 功能實(shí)現(xiàn)探索,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Go語(yǔ)言k8s?kubernetes使用leader?election實(shí)現(xiàn)選舉
這篇文章主要為大家介紹了Go語(yǔ)言?k8s?kubernetes?使用leader?election選舉,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10