golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介
日志是任何軟件的重要組成部分,Go 提供了一個(gè)內(nèi)置日志包(slog)。然而,隨著應(yīng)用的復(fù)雜性不斷增加,對(duì)結(jié)構(gòu)化日志的需求也越來(lái)越明顯。結(jié)構(gòu)化日志允許開(kāi)發(fā)人員以結(jié)構(gòu)化格式記錄數(shù)據(jù),便于日志聚合工具進(jìn)行解析和分析,目前業(yè)界使用比較多的是:zap。
在本文中,我將簡(jiǎn)單介紹 slog 包、它的功能以及如何在 Go 應(yīng)用程序中使用它。
什么是 slog
slog 提供結(jié)構(gòu)化日志記錄,其中的日志記錄包括一條消息、level 和其他各種以鍵值對(duì)表示的屬性。
使用
最新的1.21版本引入了slog。要在 Go 項(xiàng)目中使用slog,可以通過(guò)以下方式導(dǎo)入它:
import "log/slog"
這里寫(xiě)一個(gè)非常簡(jiǎn)單的例子:
func main() {
slog.Info("hello, world!", "coding", "happy")
}輸出:
2023/09/15 13:42:27 INFO hello, world! coding=happy
功能
slog 提供了許多有用的功能,使其成為 Go 的強(qiáng)大日志包。以下是其中的一些主要功能:
- 結(jié)構(gòu)化日志
- 嚴(yán)重級(jí)別日志
- 分組日志
- 自定義處理
結(jié)構(gòu)化日志
slog 默認(rèn)提供兩種方式:
- TextHandler
- JSONHandler
我們寫(xiě)一下使用這兩個(gè)方式的例子:
func main() {
textHandler := slog.NewTextHandler(os.Stdout, nil)
textLogger := slog.New(textHandler)
textLogger.Info("TextDemo",
slog.String("app-version", "v0.0.1"),
slog.Int("release-version", 1),
)
jsonHandler := slog.NewJSONHandler(os.Stdout, nil)
jsonLogger := slog.New(jsonHandler)
jsonLogger.Info("JsonDemo",
slog.String("app-version", "v0.0.1"),
slog.Int("release-version", 1),
)
}輸出為:
time=2023-09-15T13:48:37.424+08:00 level=INFO msg=TextDemo app-version=v0.0.1 release-version=1
{"time":"2023-09-15T13:48:37.4647782+08:00","level":"INFO","msg":"JsonDemo","app-version":"v0.0.1","release-version":1}
從上面我們可以看到,代碼中使用了類似slog.String的方法,slog提供了指定屬性的功能。有多種類型的屬性可供選擇:
- slog.String:字符串屬性。
- slog.Int:整數(shù)屬性。
- slog.Float64:浮點(diǎn)屬性。
- slog.Bool:布爾屬性。
- slog.Duration:持續(xù)時(shí)間屬性。
- slog.Time:時(shí)間屬性。
- slog.Group:組屬性,可用于將相關(guān)屬性分組
func main() {
jsonHandler := slog.NewJSONHandler(os.Stdout, nil)
jsonLogger := slog.New(jsonHandler)
jsonLogger.Info(
"attributes",
slog.String("version", "1.0.0"),
slog.Int("app-version", 1),
slog.Float64("point-value", 1.2),
slog.Bool("status", true),
slog.Duration("duration", time.Hour*1),
slog.Time("time", time.Now()),
slog.Group(
"request",
slog.String("path", "<https://example.com>"),
slog.String("method", "get"),
),
)
}對(duì)應(yīng)的輸出,我已經(jīng)將其格式化了:
{
"time": "2023-09-15T13:53:43.8848272+08:00",
"level": "INFO",
"msg": "attributes",
"version": "1.0.0",
"app-version": 1,
"point-value": 1.2,
"status": true,
"duration": 3600000000000,
"time": "2023-09-15T13:53:43.8848272+08:00",
"request": {
"path": "<https://example.com>",
"method": "get"
}
}嚴(yán)重級(jí)別日志
這允許我們記錄不同嚴(yán)重程度的信息。slog 默認(rèn)提供四個(gè)日志級(jí)別,每個(gè)級(jí)別都有一個(gè)整數(shù)值:
- DEBUG(-4)
- INFO(0)
- WARN(4)
- ERROR(8)
例子:
func main() {
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
jsonLogger := slog.New(jsonHandler)
jsonLogger.Debug("Hello, world!")
jsonLogger.Info("Hello, world!")
jsonLogger.Warn("Hello, world!")
jsonLogger.Error("Hello, world!")
}NOTE: 記得在NewHandler時(shí)設(shè)置級(jí)別。
分組日志
分組日志指的是將日志信息歸類為邏輯組或類別的做法。Slog 通過(guò)使用與日志記錄相關(guān)聯(lián)的屬性或鍵值對(duì)來(lái)支持分組日志記錄。
例子:
func main() {
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
jsonLogger := slog.New(jsonHandler).WithGroup("request")
jsonLogger.Info("",
slog.String("url", "<https://example.com>"),
slog.String("method", "GET"),
slog.Int("response-code", 200),
)
}這里有個(gè)比較好的實(shí)踐:
- 在 http 服務(wù)的 middleware 中定義一個(gè) request 組的 logger,會(huì)一些 4xx、5xx等請(qǐng)求的一些信息打印出來(lái)。
- 而普通業(yè)務(wù)的話,我們又可以使用一個(gè) service 組的 logger
自定義處理
slog 能夠創(chuàng)建自定義handler,將日志信息寫(xiě)入不同的目的地,如文件、數(shù)據(jù)庫(kù)或外部服務(wù)。
slog 提供的處理程序接口定義了自定義處理程序必須實(shí)現(xiàn)的方法。處理程序接口有四個(gè)方法:
type Handler interface {
Enabled(Level) bool
Handle(Record) error
WithAttrs([]Attr) Handler
WithGroup(string) Handler
}下面舉例說(shuō)明如何創(chuàng)建一個(gè)將日志信息寫(xiě)入文件的自定義handler:
type FileHandler struct {
file *os.File
}
func NewFileHandler(filename string) (*FileHandler, error) {
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil, err
}
return &FileHandler{file}, nil
}
func (h *FileHandler) Enabled(_ context.Context, level slog.Level) bool {
return true
}
func (h *FileHandler) Handle(_ context.Context, record slog.Record) error {
_, err := h.file.WriteString(record.Message + "\n")
return err
}
func (h *FileHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
return h
}
func (h *FileHandler) WithGroup(name string) slog.Handler {
return h
}
func (h *FileHandler) Close() error {
return h.file.Close()
}
func main() {
fileHandler, err := NewFileHandler("log.log")
if err != nil {
panic(err)
}
defer fileHandler.Close()
logger := slog.New(fileHandler)
logger.Info("Hello, world!")
logger.Debug("Debugging errors")
}這個(gè)時(shí)候運(yùn)行程序時(shí),控制臺(tái)就不會(huì)有對(duì)應(yīng)的日志輸出了,而是輸出到對(duì)應(yīng)文件上:
slogDemo cat .\log.log
Hello, world!
Debugging errors
總結(jié)
slog 是一個(gè)功能強(qiáng)大的 Go 日志包,提供結(jié)構(gòu)化日志功能。它易于使用,并提供了許多有用的功能,如級(jí)別日志和自定義處理程序。如果你正在尋找一個(gè)能滿足你不斷增長(zhǎng)的應(yīng)用程序需求的日志包,那么 slog 絕對(duì)值得你一試。
到此這篇關(guān)于golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介的文章就介紹到這了,更多相關(guān)go slog內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析golang多值返回以及閉包的實(shí)現(xiàn)
相對(duì)于C/C++,golang有很多新穎的特性,例如goroutine,channel等等,這些特性其實(shí)從golang源碼是可以理解其實(shí)現(xiàn)的原理。今天這篇文章主要來(lái)分析下golang多值返回以及閉包的實(shí)現(xiàn),因?yàn)檫@兩個(gè)實(shí)現(xiàn)golang源碼中并不存在,我們必須從匯編的角度來(lái)窺探二者的實(shí)現(xiàn)。2016-09-09
go?語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用
GoQuery是專為Go語(yǔ)言設(shè)計(jì)的一個(gè)強(qiáng)大的HTML解析和查詢庫(kù),本文主要介紹了go語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例
這篇文章主要給大家介紹了golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例及演示效果,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考閱讀本文2023-08-08
Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究
這篇文章主要介紹了Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
go語(yǔ)言實(shí)現(xiàn)順序存儲(chǔ)的棧
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)順序存儲(chǔ)的棧,實(shí)例分析了Go語(yǔ)言實(shí)現(xiàn)順序存儲(chǔ)的棧的原理與各種常見(jiàn)的操作技巧,需要的朋友可以參考下2015-03-03
golang編程開(kāi)發(fā)使用sort排序示例詳解
這篇文章主要為大家介紹了go語(yǔ)言編程開(kāi)發(fā)使用sort來(lái)排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
golang validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨
這篇文章主要為大家介紹了validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

