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...