上一篇文章介紹了推出 log/slog 包的背景、log/slog 包的簡(jiǎn)單介紹和使用,簡(jiǎn)單使用了 Info 函數(shù),例如:
package main
import (
"log/slog"
)
func main() {
slog.Info("hello", "標(biāo)題", "路多辛的博客")
}
這段代碼輸出的內(nèi)容如下:
2023/09/08 22:33:16 INFO hello 標(biāo)題=路多辛的博客
默認(rèn)情況下,輸出的日志格式是普通的 text 格式,這種格式并不是最適合日志系統(tǒng)的格式。日志系統(tǒng)一般采用 SON 格式或者 key=value 類(lèi)型的文本格式,log/slog?包也提供了對(duì)應(yīng)功能。
Handler
log/slog 包實(shí)現(xiàn)不同的輸出格式是使用 Handler 來(lái)實(shí)現(xiàn)的,除了默認(rèn)的?Handler,?還提供了以 JSON 格式輸出的 JSONHandler 和以 key=value 格式輸出的 TextHandler。如果要使用這兩種 Handler,需要顯式創(chuàng)建出來(lái),示例代碼如下:
package main
import (
"log/slog"
"os"
)
func main() {
loggerText := slog.New(slog.NewTextHandler(os.Stderr, nil))
loggerText.Info("hello", "標(biāo)題", "路多辛的博客")
loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, nil))
loggerJSON.Info("hello", "標(biāo)題", "路多辛的博客")
}
上述代碼分別創(chuàng)建了一個(gè)使用 TextHandler 的 Logger 實(shí)例和一個(gè)使用 JSONHandler 的 Logger 實(shí)例,運(yùn)行結(jié)果如下:
time=2023-09-09T20:17:11.845+08:00 level=INFO msg=hello 標(biāo)題=路多辛的博客
{"time":"2023-09-09T20:17:11.846302+08:00","level":"INFO","msg":"hello","標(biāo)題":"路多辛的博客"}
也可以實(shí)現(xiàn)自己的 Handler,關(guān)于這塊知識(shí)接下來(lái)的文章會(huì)專(zhuān)門(mén)介紹。
HandlerOption
創(chuàng)建 TextHandler 和 JSONHandler 對(duì)象時(shí)都可以接受 *HandlerOptions 類(lèi)型的參數(shù),用于設(shè)置日志級(jí)別、是否顯示日志調(diào)用的源文件和行信息以及在記錄屬性之前修改屬性。看個(gè)示例:
package main
import (
"log/slog"
"os"
)
func main() {
opts := slog.HandlerOptions{
AddSource: true,
}
loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
loggerJSON.Info("hello", "標(biāo)題", "路多辛的博客")
}
創(chuàng)建 JSONHandler 時(shí),設(shè)置顯示調(diào)用的源文件和行信息,運(yùn)行看下結(jié)果:
{"time":"2023-09-09T20:38:10.868172+08:00","level":"INFO","source":{"function":"main.main","file":"/Users/ning/projects/go/workspace/hello/bin.go","line":13},"msg":"hello","標(biāo)題":"路多辛的博客"}
可以看到通過(guò) Info 方法輸出的日志信息里面包含了打印日志的代碼文件以及在源代碼文件中的位置。
設(shè)置默認(rèn) Logger
可以通過(guò) SetDefault 函數(shù)設(shè)置默認(rèn)的?Logger 類(lèi)型,設(shè)置默認(rèn) Logger 后打印日志的頂級(jí)函數(shù),例如 Info、Warn、Error 等都會(huì)按照新的格式打印日志,看個(gè)示例:
package main
import (
"log/slog"
"os"
)
func main() {
loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
slog.SetDefault(loggerJSON)
slog.Info("hello", "標(biāo)題", "路多辛的博客")
}
運(yùn)行看下輸出結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-703779.html
{"time":"2023-09-09T21:14:15.213592+08:00","level":"INFO","msg":"hello","標(biāo)題":"路多辛的博客"}
可以看到,使用?SetDefault 函數(shù)將默認(rèn) Logger 設(shè)置為了?loggerJSON,再調(diào)用 Info 函數(shù)后,就按照 JSON 格式打印日志了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-703779.html
到了這里,關(guān)于Golang 結(jié)構(gòu)化日志包 log/slog 詳解(二):Handler的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!