Golang結(jié)構(gòu)化日志包log/slog的使用詳解
前言
在 Go 1.21以前,官方提供的用于打印日志的包是標(biāo)準(zhǔn)庫中的 log 包,該包雖然被廣泛使用,但是缺點也很多,Go 社區(qū)要求改進(jìn)的聲音不斷,主要有以下缺點:
log 包只提供了基本的日志記錄功能,功能相對太過簡單,缺乏很多常用功能,例如日志級別控制、自定義日志格式等,這就導(dǎo)致在很多應(yīng)用程序中無法滿足日志處理的需求。
不能自定義輸出目標(biāo),log 包默認(rèn)將日志輸出到標(biāo)準(zhǔn)錯誤(stderr)。如果需要將日志輸出到其他地方,例如文件、隊列或日志存儲系統(tǒng)等,就需要自己實現(xiàn)或者使用第三方日志包來滿足這些需求。
Go 1.21新增的 log/slog 完美解決了以上問題,并且?guī)砹撕芏嗥渌軐嵱玫奶匦浴?/p>
log/slog 包初體驗
log/slog 包提供結(jié)構(gòu)化的日志記錄功能,其中的日志記錄包括時間、日志級別、消息和以鍵值對表示的各種其他屬性。
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)方法來實現(xiàn)的。
日志記錄由時間、級別、消息和一組鍵值對組成,其中鍵是字符串,值可以是任何類型??磦€簡單的示例:
package main
import (
"log/slog"
)
func main() {
slog.Info("hello", "count", 3)
}使用 slog.Info 函數(shù)創(chuàng)建了一條記錄,包括打印時間、日志級別 Info、消息為“hello”和一個鍵為“count”值為 3 的鍵值對。運行結(jié)果如下:
2023/09/07 22:00:33 INFO hello count=3
Info 函數(shù)是通過調(diào)用默認(rèn) Logger 的 相關(guān)方法實現(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 方法實現(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)
}運行看下效果:
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)文章
golang結(jié)構(gòu)化日志slog的用法簡介
日志是任何軟件的重要組成部分,Go?提供了一個內(nèi)置日志包(slog),在本文中,小編將簡單介紹一下slog包的功能以及如何在?Go?應(yīng)用程序中使用它,感興趣的可以了解下2023-09-09
Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼
本文介紹DuckDB查詢Parquet文件的典型應(yīng)用場景,掌握DuckDB會讓你的產(chǎn)品分析能力更強,相反系統(tǒng)運營成本相對較低,為了示例完整,我也提供了如何使用Python導(dǎo)出MongoDB數(shù)據(jù),需要的朋友可以參考下2025-01-01
Go語言結(jié)合Gin框架快速實現(xiàn)分頁查詢接口
在開發(fā)?Web?應(yīng)用時,分頁查詢?是非常常見的需求,在?Go?語言中,我們可以結(jié)合?GORM?+?Gin?框架,快速實現(xiàn)分頁查詢接口,下面我們來看看具體實現(xiàn)方法吧2025-08-08
Golang使用gin框架實現(xiàn)一個完整的聊天室功能
由于我們項目的需要,我就研究了一下關(guān)于websocket的相關(guān)內(nèi)容,去實現(xiàn)一個聊天室的功能,經(jīng)過幾天的探索,現(xiàn)在使用Gin框架實現(xiàn)了一個完整的聊天室+消息實時通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文2023-08-08
Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法
本文主要介紹了Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

