golang 新一代標準日誌庫 slog
log/slog 是 Go 1.21 引入的一個新的日誌記錄包,旨在提供比傳統 log 包更靈活和現代化的日誌功能。它支持結構化日誌、可配置的日誌級別、靈活的日誌輸出格式等功能,彌補了舊版 log 包的不足。
- 對比舊版 log 包
使用方法
1. 創建日誌記錄器
slog 的核心是 Logger,可以通過默認記錄器或自定義記錄器來記錄日誌
使用默認日誌記錄器示例
func main() {
// 使用默認日誌記錄器,此模式日誌輸出格式爲text文本型,且不會輸出Debug級別日誌
logger := slog.Default()
// 輸出結構化日誌
logger.Debug("This is a debug message")
logger.Info("Starting qkp platform log","version","v3.2.2")
logger.Warn("Low disk space","remaining","500MB")
logger.Error("Failed to connect to ETCD cluster","error","connection timeout")
}
2024/12/08 21:55:08 INFO Starting qkp platform log version=v3.2.2
2024/12/08 21:55:08 WARN Low disk space remaining=500MB
2024/12/08 21:55:08 ERROR Failed to connect to ETCD cluster error="connection timeout"
2. 日誌級別控制
slog 支持以下日誌級別
-
slog.LevelDebug
-
slog.LevelInfo
-
slog.LevelWarn
-
slog.LevelError
HandlerOptions 是 log/slog 提供的一種配置結構,用於自定義日誌處理器的行爲。通過配置 HandlerOptions,可以實現日誌的源位置跟蹤、日誌級別動態調整,以及對日誌屬性的定製化處理,參數包括如下:
-
AddSource
:啓用源代碼位置記錄,便於定位日誌位置 -
Level
:控制日誌級別,可靜態或動態調整 -
ReplaceAttr
:修改、移除或過濾屬性,支持靈活的日誌定製
按照日誌級別控制, 並輸出 JSON 格式
package main
import(
"log/slog"
"os"
)
func main(){
handler := slog.NewJSONHandler(os.Stdout,&slog.HandlerOptions{
Level: slog.LevelDebug,
})
logger := slog.New(handler)
// 輸出結構化日誌
logger.Debug("This is a debug message")
logger.Info("Starting qkp platform log","version","v3.2.2")
logger.Warn("Low disk space","remaining","500MB")
logger.Error("Failed to connect to ETCD cluster","error","connection timeout")
}
{"time":"2024-12-08T22:04:02.194775+08:00","level":"DEBUG","msg":"This is a debug message"}
{"time":"2024-12-08T22:04:02.195138+08:00","level":"INFO","msg":"Starting qkp platform log","version":"v3.2.2"}
{"time":"2024-12-08T22:04:02.195144+08:00","level":"WARN","msg":"Low disk space","remaining":"500MB"}
{"time":"2024-12-08T22:04:02.195149+08:00","level":"ERROR","msg":"Failed to connect to ETCD cluster","error":"connection timeout"}
3. 自定義日誌處理器(Handler)
slog.Handler 是日誌輸出的核心接口,允許自定義日誌處理行爲 內置處理器
-
slog.NewTextHandler
: 以文本形式輸出日誌(默認格式) -
slog.NewJSONHandler
: 以 JSON 格式輸出日誌
4. 使用上下文記錄器
slog 支持通過上下文管理附加信息
package main
import(
"log/slog"
"os"
)
func main(){
handler := slog.NewJSONHandler(os.Stdout,&slog.HandlerOptions{
Level: slog.LevelDebug,
})
logger := slog.New(handler).With("platform","qkp","version","v3.2.2")
// 輸出結構化日誌
logger.Debug("This is a debug message")
logger.Info("Starting qkp platform log","version","v3.2.2")
logger.Warn("Low disk space","remaining","500MB")
logger.Error("Failed to connect to ETCD cluster","error","connection timeout")
}
{"time":"2024-12-08T22:09:02.400349+08:00","level":"DEBUG","msg":"This is a debug message","platform":"qkp","version":"v3.2.2"}
{"time":"2024-12-08T22:09:02.400673+08:00","level":"INFO","msg":"Starting qkp platform log","platform":"qkp","version":"v3.2.2","version":"v3.2.2"}
{"time":"2024-12-08T22:09:02.400678+08:00","level":"WARN","msg":"Low disk space","platform":"qkp","version":"v3.2.2","remaining":"500MB"}
{"time":"2024-12-08T22:09:02.400682+08:00","level":"ERROR","msg":"Failed to connect to ETCD cluster","platform":"qkp","version":"v3.2.2","error":"connection timeout"}
5. 集成 lumberjack 進行日誌切片和歸檔
package main
import(
"gopkg.in/natefinch/lumberjack.v2"
"log/slog"
)
func main(){
// 配置 lumberjack 日誌歸檔
lumberjackLogger :=&lumberjack.Logger{
Filename:"/tmp/app.log",// 日誌文件路徑
MaxSize:10,// 單個日誌文件最大大小(單位:MB)
MaxBackups:5,// 保留的舊日誌文件個數
MaxAge:30,// 保留的舊日誌文件最大天數(單位:天)
Compress:true,// 是否壓縮舊日誌文件
}
handler := slog.NewJSONHandler(lumberjackLogger,&slog.HandlerOptions{
AddSource:true,// 如果設置爲 true,日誌輸出中將包含源代碼的位置(文件名和行號),默認值:false(不記錄源位置)
Level: slog.LevelDebug,
})
logger := slog.New(handler).With("platform","qkp","version","v3.2.2")
// 輸出結構化日誌
logger.Debug("This is a debug message")
logger.Info("Starting qkp platform log","version","v3.2.2")
logger.Warn("Low disk space","remaining","500MB")
logger.Error("Failed to connect to ETCD cluster","error","connection timeout")
在 / tmp 目錄下查詢 app.log 日誌
cat /tmp/app.log
{"time":"2024-12-08T22:17:46.720471+08:00","level":"DEBUG","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":42},"msg":"This is a debug message","platform":"qkp","version":"v3.2.2"}
{"time":"2024-12-08T22:17:46.720688+08:00","level":"INFO","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":43},"msg":"Starting qkp platform log","platform":"qkp","version":"v3.2.2","version":"v3.2.2"}
{"time":"2024-12-08T22:17:46.720696+08:00","level":"WARN","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":44},"msg":"Low disk space","platform":"qkp","version":"v3.2.2","remaining":"500MB"}
{"time":"2024-12-08T22:17:46.720702+08:00","level":"ERROR","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":45},"msg":"Failed to connect to ETCD cluster","platform":"qkp","version":"v3.2.2","error":"connection timeout"}
6. 結合歸檔日誌級別以及替換關鍵字格式化日誌
package main
import(
"gopkg.in/natefinch/lumberjack.v2"
"log/slog"
)
func main(){
// 配置 lumberjack 日誌歸檔
lumberjackLogger :=&lumberjack.Logger{
Filename:"/tmp/app.log",// 日誌文件路徑
MaxSize:10,// 單個日誌文件最大大小(單位:MB)
MaxBackups:5,// 保留的舊日誌文件個數
MaxAge:30,// 保留的舊日誌文件最大天數(單位:天)
Compress:true,// 是否壓縮舊日誌文件
}
handler := slog.NewJSONHandler(lumberjackLogger,&slog.HandlerOptions{
AddSource:true,// 如果設置爲 true,日誌輸出中將包含源代碼的位置(文件名和行號),默認值:false(不記錄源位置)
Level: slog.LevelDebug,
ReplaceAttr:func(groups []string, a slog.Attr) slog.Attr{
// 替換關鍵字platform 的值從qkp變成kubernetes
if a.Key=="platform"{
return slog.Attr{Key: a.Key,Value: slog.StringValue("kubernetes")}
}
return a
},
})
logger := slog.New(handler).With("platform","qkp","version","v3.2.2")
// 輸出結構化日誌
logger.Debug("This is a debug message")
logger.Info("Starting qkp platform log","version","v3.2.2")
logger.Warn("Low disk space","remaining","500MB")
logger.Error("Failed to connect to ETCD cluster","error","connection timeout")
}
輸出結果:
{"time":"2024-12-08T22:28:49.965694+08:00","level":"DEBUG","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":49},"msg":"This is a debug message","platform":"kubernetes","version":"v3.2.2"}
{"time":"2024-12-08T22:28:49.966204+08:00","level":"INFO","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":50},"msg":"Starting qkp platform log","platform":"kubernetes","version":"v3.2.2","version":"v3.2.2"}
{"time":"2024-12-08T22:28:49.966243+08:00","level":"WARN","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":51},"msg":"Low disk space","platform":"kubernetes","version":"v3.2.2","remaining":"500MB"}
{"time":"2024-12-08T22:28:49.966259+08:00","level":"ERROR","source":{"function":"main.main","file":"/Users/hurricane/github/test01/main.go","line":52},"msg":"Failed to connect to ETCD cluster","platform":"kubernetes","version":"v3.2.2","error":"connection timeout"}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/gE6LrcnHbUiqajZLgmyl0Q