詳解Golang中日志庫glog的使用
〇、前言
golang/glog 是 C++ 版本 google/glog 的 Go 版本實現(xiàn),基本實現(xiàn)了原生 glog 的日志格式。
在 Kuberntes 中,glog 是默認日志庫。因此需要詳細了解下。下面列舉下 glog 的特點:
- 高效性:glog 采用了異步寫入日志的方式,這意味著日志記錄操作不會阻塞主程序的執(zhí)行。它還使用了緩沖區(qū)來收集日志消息,并在后臺線程中將它們寫入磁盤。這種異步寫入機制可以顯著提高應用程序的性能。
- 靈活配置:glog 允許您通過命令行參數(shù)或配置文件來自定義日志輸出的行為??梢灾付ㄒ涗浀娜罩炯墑e、日志文件的路徑、是否同時輸出到標準錯誤流等。這使得 glog 非常適合于不同環(huán)境和需求的應用程序。
- 日志級別控制:glog 支持不同的日志級別,包括 INFO、WARNING、ERROR、FATAL 等。可以根據(jù)需要,選擇要記錄的日志級別,以便及時發(fā)現(xiàn)關鍵的日志信息。
- 日志格式化:glog 提供了豐富的日志格式化選項,允許您按照自己的喜好定義日志的輸出格式。您可以指定時間戳、源代碼位置、日志級別等信息的顯示方式,以及自定義的文本和變量的輸出。
- 日志回滾:glog 支持日志文件的自動回滾功能,可以根據(jù)文件大小或日期來切分日志文件。這樣可以避免單個日志文件過大導致難以管理和分析。
- 跨平臺支持:glog 是一個跨平臺的日志庫,可以在不同的操作系統(tǒng)上使用。它提供了對 Unix、Linux 和 Windows 等主流操作系統(tǒng)的支持。
強大功能且簡單易用的 glog 日志庫,為 GO 語言開發(fā)者提供了一種高效、靈活和可定制的日志記錄解決方案。無論是小型項目還是大規(guī)模應用程序,glog 都能滿足日常的日志需求,也能協(xié)助開發(fā)者更好地理解和調試代碼。
glog 的基本實現(xiàn)邏輯就是,在 buffer 中寫入格式化的內(nèi)容并定期刷入文件中。
一、glog 詳細介紹
1.1 日志級別與測試
glog 將日志級別分為 4 種,分別是:
- INFO:一般日志,可用于記錄程序運行狀態(tài);
- WARNING:警告日志,記錄潛在的問題或錯誤;
- ERROR:錯誤日志,記錄程序運行中一些可恢復的錯誤,可能導致程序功能受限或出現(xiàn)異常情況,但是不會導致系統(tǒng)崩潰;
- FATAL:嚴重錯誤日志,程序遇到一個不可恢復的錯誤,在打印完日志后程序將會自動退出(
os.Exit()
)
開始測試之前,準備工作:
// 1.創(chuàng)建文件夾和文件:./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() { // 用于解析命令行中 - 橫線后邊的參數(shù)和值,如下示例中的:-log_dir=log -alsologtostderr // go run main.go -log_dir=log -alsologtostderr flag.Parse() // defer() 退出前執(zhí)行,清空緩存區(qū),將日志寫入文件 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) }
然后就是執(zhí)行代碼:
// 1.創(chuàng)建 log 文件夾,必須先創(chuàng)建,否則無法以文件形式輸出日志 mkdir log // 2.將日志寫入到 log 文件夾下 go run main.go -log_dir=log -alsologtostderr // log_dir:用來指定日志文件夾名 // alsologtostderr:表示既在標準窗口輸出也在文件中記錄
記錄日志的其他配置項簡介:
- -stderrthreshold=ERROR 達到或高于此嚴重程度的日志事件被記錄為標準錯誤以及文件。
- -log_backtrace_at="" 設置保存一般日志的文件和行號,例如:-log_backtrace_at = gopherflakes.go:234,默認堆棧跟蹤都會寫入 Info 日志,文件名的后綴可以不為 .go。
- -v=0 在指定級別上啟用 v 級日志記錄。
- -vmodule="" 通過數(shù)字指定文件的記錄日志級別,可以同時配置多個文件的不同級別,用‘,’分隔。例如:-vmodule=recordio=2,file=1,gfs*=3,最后一個代表所有以‘gfs’開頭的文件記錄 3 級以下的日志。文件名的后綴必須為 .go,且可省略。
下面看下 Warning 級別的日志文件記錄的內(nèi)容:
1.2 vmodule 配置
vmodule 參數(shù)通過 -v=int 來自由配置輸出級別,int 代表級別的數(shù)字,默認為 0。如下示例:
package main import ( "flag" "github.com/golang/glog" ) func main() { // 用于解析命令行中 - 橫線后邊的參數(shù)和值,如下示例中的:-log_dir=log -alsologtostderr // go run main.go -log_dir=log -alsologtostderr flag.Parse() // defer() 退出前執(zhí)行,清空緩存區(qū),將日志寫入文件 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 級別的日志:
1.3 vmodule 多文件配置不同的日志級別
通過該功能,可以對指定模塊采用不同日志級別的輸出,可有效提升調試效率。
main.go 文件內(nèi)容:
package main import ( "flag" "github.com/golang/glog" ) func main() { // 用于解析命令行中 - 橫線后邊的參數(shù)和值,如下示例中的:-log_dir=log -alsologtostderr // go run main.go -log_dir=log -alsologtostderr flag.Parse() // defer() 退出前執(zhí)行,清空緩存區(qū),將日志寫入文件 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 文件內(nèi)容:
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
1.4 traceLocation 功能(log_backtrace_at 參數(shù)配置)
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
1.5 日志格式簡介
從前邊幾節(jié)中可知,日志默認的格式為:<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() 的調用結果。
到此這篇關于詳解Golang中日志庫glog的使用的文章就介紹到這了,更多相關Go日志庫glog內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go中gin框架的*gin.Context參數(shù)常見實用方法
*gin.Context是處理HTTP請求的核心,ctx代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數(shù)據(jù)、響應構建器、路由參數(shù)等,這篇文章主要介紹了Go中gin框架的*gin.Context參數(shù)常見實用方法,需要的朋友可以參考下2024-07-07golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例
時間和日期是我們編程中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關于golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例,需要的朋友可以參考下2022-08-08