Go標準庫glog使用詳解

2021-10-19 07:37:31 字數 3818 閱讀 9634

golang/glog 是 c++ 版本 google/glog 的 go 版本實現,基本實現了原生 glog 的日誌格式。在 kuberntes 中,glog 是預設日誌庫。

目錄

glog 的通用功能

glog的 vmodule 功能

glog的 tracelocation 功能

glog的日誌格式

glog 的實現 參考

glog 將日誌級別分為 4 種,分別是:

)func main()當我們執行:

$ mkdir -p log && go run main.go -log_dir=log -alsologtostderr
以上列印日誌將會同時列印在log/目錄和標準錯誤輸出中-alsologtostderr

其中在log/中將會產生如下日誌檔案:

main.info -> main.ut1.test.log.info.20180715-130428.27339

main.warning -> main.ut1.test.log.warning.20180715-130428.27339

main.error -> main.ut1.test.log.error.20180715-130428.27339

main.fatal -> main.ut1.test.log.fatal.20180715-130428.27339

main.ut1.test.log.error.20180715-130428.27339

main.ut1.test.log.fatal.20180715-130428.27339

main.ut1.test.log.info.20180715-130428.27339

main.ut1.test.log.warning.20180715-130428.27339

其中main.info這類檔案表示的是info日誌對應的符號鏈結。當單個日誌檔案達到一定大小時,glog 將會有rotate的動作:即關閉已經滿量的檔案,新建日誌檔案

glog 最常用的就是 v level 的功能,如下所示:

func main()
當我們重新執行:

$ go run main.go -log_dir=log -alsologtostderr
將不會看到任何輸出,因為日誌級別不夠,我們通過指定日誌級別-v,log level)

$ go run main.go -v=4 -log_dir=log -alsologtostderr
此時,日誌級別小於或等於 4 的日誌將被列印出來:

i0715 13:15:41.380611   29471 main.go:13] level 3 message

i0715 13:15:41.388777 29471 main.go:14] level 4 message

如果我們想對不同的檔案實行不同的日誌級別,可以用 vmodule 功能,如下**:

func main()
其中bar()的實現在bar.go

func bar()
當我們執行:

$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5
對所有檔案的日誌級別設定為3 (-v=3,但是對bar.go-vmodule的輸入引數省去.go字尾,且必須以-vmodule=recordio=2,file=1,gfs*=3的語法格式)的日誌級別設定為 5,此時會輸出:

i0715 13:20:28.381611   30447 bar.go:6] level 4: level 4 message in bar.go

i0715 13:20:28.383866 30447 main.go:14] level 3 message

通過該功能,可以對指定模組採用不同日誌級別的輸出,可有效提公升除錯效率。

ps:這裡原博主的例子不是很好,有點迷惑人,並沒有辦法體現出-vmodule=bar=5這個命令的意義,因為main還是會呼叫bar()函式,bar函式中的命令是level 4級別的,所以還是會輸出。

tracelocation 的命令格式為-log_backtrace_at=gopherflakes.go:234,當執行到指定**處時,將把該**的棧資訊列印出來,延續上面的**,我們執行:

$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5 -log_backtrace_at=bar.go:6
可見如下輸出:

i0715 13:28:17.915837   31920 bar.go:6] level 4: level 4 message in bar.go

... 列印 backtrace,此處省略 ...

i0715 13:28:17.923715 31920 main.go:14] level 3 message

從上面的例子可以看出,glog 列印的日誌基本格式為:

]
header 和 message 之間用]分隔。其中 header 的格式為:

lmmdd hh:mm:ss.uuuuuu threadid file:line
這裡要注意的是l,它代表了 glog 原本的日誌級別:

i -> info

w -> warning

e -> error

f -> fatal

後面幾個字段分別代表的是時間資訊。在 c++ 中,threadid表示的是執行緒資訊,但在 go 版本實現中,threadid是程序 pid,即os.getpid()的呼叫結果。

這部分詳細**可參考:glog.go中的formatheader()函式。

其實,用 go 實現乙個日誌庫並不困難,其本質就是:在 buffer 中寫入格式化的內容並定期刷入檔案中。glog 的基本實現邏輯也是如此。

深入學習 go 語言函式呼叫資訊

an example of how to use golang/glog

Go語言標準庫Json的使用

github上別人做的封裝,挺好用的,推薦一下 這個內建的標準庫用起來還是很煩得,要知道對方發過來的type,不然只能自己分析反射.package main import encoding json fmt type status slice int type info struct func ma...

Go語言標準庫flag基本使用

文章引用自 如果你只是簡單的想要獲取命令列引數,可以像下面的 示例一樣使用os.args來獲取命令列引數。package main import fmt os demo func main 將上面的 執行go build o args demo 編譯之後,執行 args demo a b c d a...

go筆記 標準庫 json

json資料格式通常包含兩個操作 序列化 把物件轉換成json資料型別 和反序列化 把json資料型別轉換成物件 二者操作互逆。go語言中相關標準庫為encoding json。package main import encoding json fmt type jsonexample struct...