在 Go 語言項目開發中,我們通常需要查看日志來調試程序,所以日志的快捷搜索和過濾就會至關重要。
因為 Go 標準庫中的 log,它不是結構化日志格式,使用上并不方便,所以在 Go 1.21.0 中,Go 標準庫新增結構化日志記錄包 log/slog,它支持鍵值對格式。
本文我們介紹 log/slog 的使用方式。
log/slog 的默認 logger 使用的是 log 的默認 logger,新增日志包 log/slog 和原始日志包 log 協同工作,使 log/slog 更易上手。
log/slog 日志級別包括 Info、Debug、Warn 和 Error,log/slog 為它們分別提供了函數。
示例代碼:
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")}
輸出結果:
2023/10/06 11:18:04 This is log2023/10/06 11:18:04 INFO This is Info Level2023/10/06 11:18:04 WARN This is Warn Level2023/10/06 11:18:04 ERROR This is Error Level
閱讀上面這段代碼,我們可以發現 log/slog 的輸出結果和 log 的輸出結果非常相似,只是在日志時間和日志消息之間多了日志級別。
因為 log/slog 的默認 logger 使用的是 log 的默認 logger。
除了上述 4 個不同日志級別的函數之外,還有一個函數 log,我們可以使用 log 函數替代上述 4 個函數。
示例代碼:
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")}
輸出結果:
2023/10/06 11:41:47 INFO This is Info Level2023/10/06 11:41:47 WARN This is Warn Level2023/10/06 11:41:47 ERROR This is Error Level
閱讀上面這段代碼,我們可以發現,log 函數通過參數定義日志級別,數字越大,級別越嚴重,并且不同級別之間,預留 4 個數字,我們可以定義其他日志級別。
log 函數與 4 個分別代表不同級別的函數之間,還有另外一個區別,它的第一參數是上下文,其實 4 個分別代表不同級別的函數也對應 4 個支持第一個參數是上下文的函數,分別是 InfoContext()、DebugContext()、WarnContext() 和 ErrorContext。
細心的讀者朋友們可能發現了,為什么輸出結果沒有 Debug 級別的日志輸出?
因為 log/slog 的默認 logger 的默認日志級別是 Info,如果我們想要使用日志級別 Debug,可以新建 logger,并把默認日志級別設置為 Debug。
前面我們已經說過 log/slog 支持鍵值對格式,但是上述示例代碼中并沒有體現,接下來,我們以 Info 函數為例,介紹 log/slog 怎么輸出鍵值對格式。
func main() { slog.Info("This is Info Level", "uid", 1001)}
輸出結果:
2023/10/06 11:58:07 INFO This is Info Level uid=1001
閱讀上面這段代碼,我們發現 Info 函數中,在日志消息之后新增兩個參數,分別是 uid 和 1001,它們就是鍵值對的 key 和 value。
因為 log/slog 默認使用 log 的默認 logger,所以輸出格式就是我們上面看到的文本格式。
我們可以使用內置的 Handler NewTextHandler 和 NewJSONHandler創建新的 Logger,來輸出新文本格式和 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)}
輸出結果:
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}
閱讀上面這段代碼,我們可以發現通過內置 Handler 創建新的 Logger,輸出新的日志格式,其中 NewTextHandler 輸出的所有內容都是鍵值對格式,NewJSONHandler 輸出一個 json 對象。
此外,我們還可以自定義 Handler,通過實現 slog.Handler 接口,生成特定的輸出日志格式或者 wrap 另一個 Handler 來豐富其功能。
本文我們介紹 log/slog 的使用方式,包括日志級別和輸出日志格式。
限于篇幅,還有一些進階用法沒有介紹,比如 LogAttrs 函數,以及 NewTextHandler 和 NewJSONHandler 的方法。
本文鏈接:http://www.tebozhan.com/showinfo-26-12377-0.htmlGo 1.21.0 中新增的結構化日志記錄標準庫 log/slog 詳解
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 希爾排序:優化插入排序的精妙算法