本篇內容直接整理自官方文檔及我的理解,若是能夠建議直接查看官方文檔,html
glog是什麼?
Google glog is a library that implements application-level logging.
This library provides logging APIs based on C++-style streams and various helper macros.
glog主要內容
- 日誌等級
- 系統預約義等級:INFO(=0)<WARNING(=1)<ERROR(=2)<FATAL(=3)
- 以上是簡寫形式,可經過宏關閉簡寫形式,其原始定義是有GLOG_前綴
- 在windows中可能存在ERROR宏衝突的問題,經過宏監測會在編譯器提示
- 最嚴重級別是FATAL級別,對應DEBUG模式是DFATAL級別
- 在輸出FATAL日誌消息後,會終止程序運行
- DEBUG模式中,DFATAL級別對應ERROR--便於調試,而非DEBUG模式則對應FATAL
- 每一個級別都對應有相應的日誌文件,日誌文件的位置及名稱定義以下:
- 文件默認存放在臨時文件中,windows下是"C:\Users\user_name\AppData\Local\Temp",Linux是"/tmp"
- 文件名稱:programname.hostname.user_name.log.severity_level.date.time.pid
- Linux系還會建立爲每一個文件建立一個文件連接
- 日誌輸出採用以下規則:
- 每一個級別的日誌除了輸出到對應日誌文件中,還輸出到每一個低級別日誌文件中
- 如一個ERROR日誌,會輸出到INFO,WARNING,ERROR三個日誌文件中
- 默認,ERROR和FATAL消息除了輸出到日誌文件中以外,還會輸出到標準錯誤中
- 符號變量
- 經過符號變量能夠定製日誌行爲
- 設置符號變量的三個方法:
- 系統裝有google-fglags庫,在安裝google-glog時會自動使用google-fglags庫
- 可經過命令行參數來設置符號變量,如--logtostderr=1
- PS:網上查找資料時看到內容:使用google-fglags庫後vglgrind會提示內存泄漏(未驗證)
- 系統未安裝google-fglags庫,經過使用前綴"GLOG_"的環境變量可設置符號變量
- 在程序中,經過修改全局變量(使用前綴"FLAGS_")來設置符號變量
- 大多數符號變量修改後會當即生效
- 與輸出位置有關(如FLAGS_log_dir),若是要生效須要在google::InitGoogleLogging()以前設置
- 符號變量包括:
- logtostderr(bool,default=false),只輸出到STDERR而不寫入日誌文件
- stderrthreshold(int,default=2,which is ERROR),高於該級別的日誌除寫入日誌文件還輸出到STDERR
- minloglevel(int,default=0,which is INFO),低於該級別的日誌消息不輸出
- log_dir(string,default=""),日誌輸出目錄
- v(int,default=0),小於等於該值的VLOG(m)會被輸出,不然不會輸出
- vmodule(string,default=""),可爲源文件定製VLOG日誌輸出級別
- max_log_size(int,default=1800),日誌文件最大值(單位MB)
- log_link(string,default=""),日誌文件的鏈接所在的文件夾
- stop_logging_if_full_disk(bool,default=false),若是磁盤寫盡是否中止記錄日誌
- alsologtoemail(string,default=""),是否將日誌額外發送郵件到指定地址
- logemaillevel(int,default=999),設置發送郵件的日誌等級
- logmailer(string,default="/bin/mail"),發送郵件程序
- DEBUG模式支持
- DEBUG模式日誌輸出形式,增長前綴D表示DEBUG模式日誌,如DLOG(log_severity),DLOG_IF(log_severity,condition)
- 採用DEBUG宏控制,非DEBUG模式中DEBUG日誌不會編譯進程序就避免了程序冗餘
- 豐富的助手宏
- 全部助手宏中,由於有條件判斷因此須要確認是否要將函數調用放在日誌輸出中
- 條件宏:
- 計數宏:
- LOG_EVERY_N(log_severity,num)
- LOG_IF_EVERY_N(log_severity,condition,num)
- LOG_FIRST_N(log_severity,num)
- 使用google::COUNTER計數
- 驗證宏:
- 功能相似assert斷言,但不受DEBUG模式控制即非DEBUG模式也生效
- 若是驗證失敗,會寫FATAL日誌並終止程序運行
- CHECK(condition)
- 比較驗證:
- CHECK_EQ(arg1,arg2)
- CHECK_NE(arg1,arg2)
- CHECK_LE(arg1,arg2)
- CHECK_LT(arg1,arg2)
- CHECK_GE(arg1,arg2)
- CHECK_GT(arg1,arg2)
- CHECK_NOTNULL(arg)
- 字符串比較:
- CHECK_STREQ
- CHECK_STRNE
- CHECK_STRCASEEQ
- CHECK_STRCASENE
- 浮點數驗證:
- CHECK_DOUBLE_EQ
- CHECK_NEAR
- 其中CHECK_NOTNULL不能做爲日誌輸出流使用
- 比較驗證中,在輸出中會輸出比較值,因此要求比較值重載了輸出操做符(operator<<(ostream,...))
- 在驗證宏中,參數會是匿名參數如CHECK(string("abc")[1],'b')
- 定製日誌(Verbose Logging)
- 目的:便於追蹤不一樣的BUG,提供自定義日誌級別
- 級別控制:
- 日誌等級嚴重性與系統默認正好相反,大於-v設定級別的日誌不會輸出
- 默認-v級別是0,級別可定義爲負數
- 日誌輸出:
- 全部的VLOG宏日誌消息都輸出到INFO對應日誌文件中
- VLOG_IS_ON(n)使用:
- 輔助宏:
- 系統定義的輔助宏,都用對應的定製版本,須要加前綴V和更換系統日誌級別爲定製級別
- 特意的信號量處理
- 針對可能致使程序崩潰的信號會輸出dump信息
- 處理的信號包括:
- SIGSEGV,SIGILL,SIGABRT,SIGBUS,SIGTERM
- 相關函數:
- google::InstallFailureSignalHandler()
- google::InstallFailureWriter(void (writer)(const char data,int size))
- 默認dump信息輸出到STDERR,可經過該函數定製dump輸出目標
- 其餘注意事項
- 1.條件宏中,若是爲假則右邊日誌中的函數不會執行
- 2.默認FATAL日誌和CHECK*宏會終止程序:
- 默認會輸出堆棧信息後以狀態1退出程序
- 可經過google::InstallFailureFunction(void (*func)())定製錯誤處理
- 3.支持線程安全的日誌Raw Logging,不分配內存和加解同步鎖
- 4.支持Google Style perror(),在系統日誌宏前加前綴P,如PLOG(log_severity)
- 5.支持Syslog,須要注意的是若是syslog配製爲遠程日誌記錄時的性能問題
- 6.可經過GOOGLE_STRIP_LOG宏,在編譯器就過濾掉不要的日誌輸出
- 與符號變量minloglevel不用,該宏在編譯器進行--即編譯後的程序不可更改
- 該宏同時會影響與INFO相關聯的VLOGs日誌
- 7.windows平臺,可能存在ERROR宏衝突問題,可經過禁用簡短日誌等級名稱來規避