golang/glog 是 C++ 版本 google/glog 的 Go 版本實現,基本實現了原生 glog 的紀錄檔格式。
在 Kuberntes 中,glog 是預設紀錄檔庫。因此需要詳細瞭解下。下面列舉下 glog 的特點:
強大功能且簡單易用的 glog 紀錄檔庫,為 GO 語言開發者提供了一種高效、靈活和可客製化的紀錄檔記錄解決方案。無論是小型專案還是大規模應用程式,glog 都能滿足日常的紀錄檔需求,也能協助開發者更好地理解和偵錯程式碼。
glog 的基本實現邏輯就是,在 buffer 中寫入格式化的內容並定期刷入檔案中。
glog 將紀錄檔級別分為 4 種,分別是:
os.Exit()
)開始測試之前,準備工作:
// 1.建立資料夾和檔案:./src/glog/main.go
// 2.初始化和整理當前模組(新增或刪除)
go mod init
go mod tidy
// 3.拉取必要的庫 glog
go get github.com/golang/glog
如下為 main.go 檔案中的程式碼:
package main
import (
"flag"
"github.com/golang/glog"
)
func main() {
// 用於解析命令列中 - 橫線後邊的引數和值,如下範例中的:-log_dir=log -alsologtostderr
// go run main.go -log_dir=log -alsologtostderr
flag.Parse()
// defer() 退出前執行,清空快取區,將紀錄檔寫入檔案
defer glog.Flush()
glog.Info("This is info message")
glog.Infof("This is info message: %v", 12345)
glog.InfoDepth(1, "This is info message", 12345)
glog.Warning("This is warning message")
glog.Warningf("This is warning message: %v", 12345)
glog.WarningDepth(1, "This is warning message", 12345)
glog.Error("This is error message")
glog.Errorf("This is error message: %v", 12345)
glog.ErrorDepth(1, "This is error message", 12345)
glog.Fatal("This is fatal message")
glog.Fatalf("This is fatal message: %v", 12345)
glog.FatalDepth(1, "This is fatal message", 12345)
}
然後就是執行程式碼:
// 1.建立 log 資料夾,必須先建立,否則無法以檔案形式輸出紀錄檔
mkdir log
// 2.將紀錄檔寫入到 log 資料夾下
go run main.go -log_dir=log -alsologtostderr
// log_dir:用來指定紀錄檔資料夾名
// alsologtostderr:表示既在標準視窗輸出也在檔案中記錄
記錄紀錄檔的其他設定項簡介:
下面看下 Warning 級別的紀錄檔檔案記錄的內容:
vmodule 引數通過 -v=int 來自由設定輸出級別,int 代表級別的數位,預設為 0。如下範例:
package main
import (
"flag"
"github.com/golang/glog"
)
func main() {
// 用於解析命令列中 - 橫線後邊的引數和值,如下範例中的:-log_dir=log -alsologtostderr
// go run main.go -log_dir=log -alsologtostderr
flag.Parse()
// defer() 退出前執行,清空快取區,將紀錄檔寫入檔案
defer glog.Flush()
glog.V(0).Info("LEVEL 0 message") // 使用紀錄檔級別 0
glog.V(3).Info("LEVEL 3 message") // 使用紀錄檔級別 3
glog.V(4).Info("LEVEL 4 message") // 使用紀錄檔級別 4
glog.V(5).Info("LEVEL 5 message") // 使用紀錄檔級別 5
glog.V(8).Info("LEVEL 8 message") // 使用紀錄檔級別 8
}
如下測試結果,當不加 -v 設定項時,只輸出了預設級別為 0 的紀錄檔,當設定為 4 時,輸出 <=4 級別的紀錄檔:
通過該功能,可以對指定模組採用不同紀錄檔級別的輸出,可有效提升偵錯效率。
main.go 檔案內容:
package main
import (
"flag"
"github.com/golang/glog"
)
func main() {
// 用於解析命令列中 - 橫線後邊的引數和值,如下範例中的:-log_dir=log -alsologtostderr
// go run main.go -log_dir=log -alsologtostderr
flag.Parse()
// defer() 退出前執行,清空快取區,將紀錄檔寫入檔案
defer glog.Flush()
bar()
bar2()
glog.V(0).Info("LEVEL 0 message") // 使用紀錄檔級別 3
glog.V(3).Info("LEVEL 3 message") // 使用紀錄檔級別 3
glog.V(4).Info("LEVEL 4 message") // 使用紀錄檔級別 4
glog.V(5).Info("LEVEL 5 message") // 使用紀錄檔級別 5
glog.V(8).Info("LEVEL 8 message") // 使用紀錄檔級別 8
}
bar.go、bar2.go 檔案內容:
package main
import "github.com/golang/glog"
func bar() {
glog.V(3).Info("LEVEL 3: level 3 message in bar.go")
glog.V(4).Info("LEVEL 4: level 4 message in bar.go")
}
package main
import "github.com/golang/glog"
func bar2() {
glog.V(4).Info("LEVEL 4: level 4 message in bar2.go")
}
如下執行語句,相關的三個檔案都需要列出,全域性設定為 -v=3,bar.go 檔案中設定為 3 級,bar2.go 檔案設定為 4 級,多檔案間用‘,’分隔:
go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar=3,bar2=4
如下圖為輸出結果,bar.go 檔案中大於 3 級的紀錄檔未輸出,main.go 中 3 級及以下的紀錄檔輸出:
對於檔名還可以使用萬用字元 *,如下測試:
go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar*=4
traceLocation 的命令格式為-log_backtrace_at=bar.go:6
(檔案全名:行號),當執行到指定程式碼處時,將把該程式碼的棧資訊列印出來。
如下語句執行程式碼,在檔案 bar.go 中的第 6 行,輸出棧資訊:
go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar=3,bar2=4 -log_backtrace_at=bar.go:6
從前邊幾節中可知,紀錄檔預設的格式為:<header>] <message>
,紀錄檔頭資訊和詳細資訊通過中括號 ] 來分隔。
header 的預設格式:Lmmdd hh:mm:ss.uuuuuu threadid file:line
。其中開頭的字母 L 代表的是紀錄檔級別 level,如下對應關係:
I -> INFO
W -> WARNING
E -> ERROR
F -> FATAL
threadid 是程序 PID,即 os.Getpid() 的呼叫結果。
本文來自部落格園,作者:橙子家,微訊號:zfy1070491745,有任何疑問歡迎溝通,一起成長! 您的支援,博主的動力!
轉載本文請註明原文連結:https://www.cnblogs.com/hnzhengfy/p/GO_glog.html