這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go語言有一個標準庫,log,提供了最基本的日誌功能,但是沒有什麼進階的功能,如果需要進階的特性,可以選擇glog或log4go。
glog是google提供的,類似於google的c++ log庫,使用起來非常簡單,下面介紹一下;log4go的用法和log4j一樣,可配置性比較高。
glog只提供了少數幾個選項,通過命令列控制,例如:
-log_dir: 記錄檔儲存目錄
-alsologtostderr: 日誌寫入檔案的同時,輸出到stderr
-v:配置V輸出的等級。
glog使用非常簡單,只需要import就可以了。glog package的init函數會初始化並啟動一個glog 的flushDaemon協程,你只需要使用glog.Info, glog.Warning, glog.Error或glog.Fatal即可。
一個簡單的例子:
package mainimport ("flag""fmt""github.com/golang/glog""os")// 避免沒有引用fmt的編譯錯誤var _ = fmt.Printlnfunc main() {//初始化命令列參數flag.Parse()glog.Info("hello, glog")glog.Warning("warning glog")glog.Error("error glog")glog.Infof("info %d", 1)glog.Warningf("warning %d", 2)glog.Errorf("error %d", 3)glog.V(3).Infoln("info with v 3")glog.V(2).Infoln("info with v 2")glog.V(1).Infoln("info with v 1")glog.V(0).Infoln("info with v 0")// 退出時調用,確保日誌寫入檔案中glog.Flush()}
有幾點說明:
1、高等級的日誌會同時輸出到比它等級低的檔案中,例如error日誌會同時輸出到error檔案,warning檔案,info檔案中,依次類推;
2、啟動時,調用flag.Parse用來初始化glog的參數,例如xxx.exe -log_dir=”./” -v=3。如果不提供參數,log_dir目錄為
os.TempDir(),v的值為0
3、程式退出時,需要調用glog.Flush(),將日誌寫入檔案中。
4、V函數。預設的v選項為0,可以通過命令列設定v值。V函數的功能是,當V函數的參數高於glog的v值時,不會執行後續的Info函數,否則就執行。
glog.V(2).Info
相當於
if glog.V(2) { Info()}
V的實現很精彩,有興趣可以看看原始碼。
5、運行樣本,假設檔案名稱為f.go
go build f.gof.exe -log_dir="./" -v=3f.exe -log_dir="./" -v=2
6、記錄檔名
記錄檔名由以下幾部分組成:
程式名.電腦名.使用者名稱.log.xxx.YYYYMMDD-HHMMSS.pid,其中
xxx為日誌等級,例如INFO,ERROR,WARNING
YYYYMMDD為年月日
HHMMSS為小時,分鐘,秒
pid是進程id
7、glog.Fatal的預設行為是輸出Fatal等級日誌,並強制進程退出,不過可以自訂Fatal的行為
8、glog還提供了vmodule這樣進階的用法,有興趣可以研究一下。
glog代碼地址:
https://github.com/golang/glog