Golang結(jié)構(gòu)化日志包log/slog的使用詳解
前言
在 Go 1.21以前,官方提供的用于打印日志的包是標(biāo)準(zhǔn)庫中的 log 包,該包雖然被廣泛使用,但是缺點(diǎn)也很多,Go 社區(qū)要求改進(jìn)的聲音不斷,主要有以下缺點(diǎn):
log 包只提供了基本的日志記錄功能,功能相對太過簡單,缺乏很多常用功能,例如日志級別控制、自定義日志格式等,這就導(dǎo)致在很多應(yīng)用程序中無法滿足日志處理的需求。
不能自定義輸出目標(biāo),log 包默認(rèn)將日志輸出到標(biāo)準(zhǔn)錯誤(stderr)。如果需要將日志輸出到其他地方,例如文件、隊(duì)列或日志存儲系統(tǒng)等,就需要自己實(shí)現(xiàn)或者使用第三方日志包來滿足這些需求。
Go 1.21新增的 log/slog 完美解決了以上問題,并且?guī)砹撕芏嗥渌軐?shí)用的特性。
log/slog 包初體驗(yàn)
log/slog 包提供結(jié)構(gòu)化的日志記錄功能,其中的日志記錄包括時(shí)間、日志級別、消息和以鍵值對表示的各種其他屬性。
log/slog 包定義了一個 Logger 結(jié)構(gòu)體,這個結(jié)構(gòu)體提供了幾個方法(如 Logger.Info、Logger.Warn、Logger.Error等)用于打印不同級別的日志。每個 Logger 都與一個 Handler 相關(guān)聯(lián),Logger 的打印日志方法根據(jù)參數(shù)創(chuàng)建一條日志并傳遞給 Handler,由 Handler 來決定如何處理這條日志。log/slog 包提供的打印日志的函數(shù)例如 Info、Warn、Error 等,是通過調(diào)用默認(rèn) Logger 中的相關(guān)方法來實(shí)現(xiàn)的。
日志記錄由時(shí)間、級別、消息和一組鍵值對組成,其中鍵是字符串,值可以是任何類型??磦€簡單的示例:
package main import ( "log/slog" ) func main() { slog.Info("hello", "count", 3) }
使用 slog.Info 函數(shù)創(chuàng)建了一條記錄,包括打印時(shí)間、日志級別 Info、消息為“hello”和一個鍵為“count”值為 3 的鍵值對。運(yùn)行結(jié)果如下:
2023/09/07 22:00:33 INFO hello count=3
Info 函數(shù)是通過調(diào)用默認(rèn) Logger 的 相關(guān)方法實(shí)現(xiàn)的,看一下 Info 函數(shù)的定義:
// Info calls Logger.Info on the default logger. func Info(msg string, args ...any) { Default().log(context.Background(), LevelInfo, msg, args...) }
可以看出調(diào)用了使用 Default 函數(shù)返回的 Logger 對象中的 log 方法實(shí)現(xiàn)的,Default 函數(shù)的定義如下:
func Default() *Logger { return defaultLogger.Load().(*Logger) }
defaultLogger 是 atomic.Value 類型,存儲了默認(rèn)的 Logger 類型,這個默認(rèn)的 Logger 類型是通過 init 函數(shù)存儲進(jìn)去的,init 函數(shù)的定義如下:
func ?() { defaultLogger.Store(New(newDefaultHandler(loginternal.DefaultOutput))) }
默認(rèn)的 Logger 打印日志的函數(shù)還有 Debug、Warn 和 Error。除了這幾個很方便使用的函數(shù)外,還有一個 Log 函數(shù),可以接受一個日志級別參數(shù)??磦€簡單的示例:
package main import ( "context" "log/slog" ) func main() { slog.Log(context.Background(), slog.LevelInfo, "hello", "count", 3) }
運(yùn)行看下效果:
2023/09/07 22:09:58 INFO hello count=3、
可以看出和 直接調(diào)用 Info 函數(shù)效果是一樣的。
Logger 類型
看下 Logger 類型的定義,如下:
type Logger struct { handler Handler // for structured logging }
提供了 Log、Debug、Info、Warn 和 Error 這幾個打印日志的方法。
到此這篇關(guān)于Golang結(jié)構(gòu)化日志包log/slog的使用詳解的文章就介紹到這了,更多相關(guān)go log/slog包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?處理大數(shù)組使用?for?range?和?for?循環(huán)的區(qū)別
這篇文章主要介紹了Go處理大數(shù)組使用for?range和for循環(huán)的區(qū)別,對于遍歷大數(shù)組而言,for循環(huán)能比for?range循環(huán)更高效與穩(wěn)定,這一點(diǎn)在數(shù)組元素為結(jié)構(gòu)體類型更加明顯,下文具體分析感興趣得小伙伴可以參考一下2022-05-05解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系
這篇文章主要介紹了解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例
這篇文章主要介紹了golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下2016-07-07Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率
這篇文章主要介紹了Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個你可能不知道的Go語言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語言2024-01-01詳解golang避免循環(huán)import問題(“import cycle not allowed”)
這篇文章主要給大家介紹了關(guān)于golang中不允許循環(huán)import問題("import cycle not allowed")的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Go語言使用protojson庫實(shí)現(xiàn)Protocol Buffers與JSON轉(zhuǎn)換
本文主要介紹Google開源的工具庫Protojson庫如何Protocol Buffers與JSON進(jìn)行轉(zhuǎn)換,以及和標(biāo)準(zhǔn)庫encoding/json的性能對比,需要的朋友可以參考下2023-09-09