google-glog 開源庫分析(一):glog介紹


本篇內容直接整理自官方文檔及個人理解,如果可以建議直接查看官方文檔

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_IF(condition)
    • 計數宏:
      • 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)使用:
      • 當n小於或等於-v設定的級別是返回true
    • 輔助宏:
      • 系統定義的輔助宏,都用對應的定制版本,需要加前綴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宏沖突問題,可通過禁用簡短日志等級名稱來規避


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM