google-glog 開源庫分析(三):glog核心類結構


google-glog類核心結構

圖片地址:https://github.com/yangdw/yangdw.tech.doc/blob/master/專題_開源庫/google-glog類關系結構.jpg

工作原理

  • 每個日志輸出都對應一個google::LogMessage類對象
    • 構造函數中為日志添加必要的前綴:文件名、函數、時間、日志等級等信息
    • 析構函數中將日志消息寫入到日志文件中
    • 每個google::LogMessage對象都持有一個定制的C++輸出流及日志緩存
  • 通過定制C++輸出,實現日志的便捷輸出
    • 繼承自標准輸入輸出流,定制日志庫使用的輸出流--輸出緩存在輸出流對象初始化時提供
  • 通過C++匿名對象的短生命周期性質,實現日志的自動輸出
    • 通過宏會在日志輸出時創建google::LogMessage匿名對象,該匿名對象會在行末分號處結束生命周期自動調用析構函數
  • 內部提供統一的日志輸出接口
    • 通過內部類LogDestination提供日志輸出接口,其內部包含日志文件輸出類對象
    • 日志文件輸出對象是繼承了Logger的LogFileObject對象,每個LogFileObject對象對應一個日志文件
    • LogDestination控制日志的輸出,同時也控制日志文件的創建等行為

示例分析

  • GLOG(ERROR)<<"hello,world!";
    • 根據宏定義:
      • define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()

      • define COMPACT_GOOGLE_LOG_ERROR google::LogMessage(FILE,LINE,google::GLOG_ERROR)

    • 日志輸出語句擴展為:
      • google::LogMessage(FILE,LINE,google::GLOG_ERROR).stream()<<"hello,world!";
  • google::LogMessage(FILE,LINE,google::GLOG_ERROR),創建一個匿名對象
    • 在構造函數中,創建日志輸出流對象及日志緩存空間,並為日志添加必要的前綴信息
    • 日志輸出流對象、日志緩存空間及日志狀態標記等封裝為google::LogMessage::LogMessageData結構
  • std::ostream& google::LogMessage::stream(),方法stream()提供輸出流支持
    • 通過操作符<<將日志消息輸出到日志緩存中
  • 行結尾分號處,匿名對象生命周期結束,調用析構函數
    • 在析構函數中,日志消息通過LogDestination類提供的靜態方法接口寫入日志文件

功能划分

通過以上分析可以看出,google::LogMessage類是基本骨架,構建了日志對象及輸出通道
具體的功能則有相應的類結構來完成,包括C++輸出流及日志輸出

C++輸出流

  • LogMessage::LogStream類,日志輸出流對象
    • 繼承自std::ostream,接收日志輸出
    • 包含LogStreamBuf類數據成員
  • LogStreamBuf,日志輸出流緩存對象
    • 繼承自std::streambuf,日志輸出緩存
    • 本身不創建日志緩存區,構造函數時由參數傳入內存區
  • LogMessage::LogMessageData結構,每個LogMessage對象持有一個該結構對象
    • 包含LogMessage::LogStream類對象
    • 包含日志存儲的內存區,用改內存區初始化LogMessage::LogSteam對象
    • 包含了日志的狀體標記信息,如時間、等級、是否已經輸出等信息

日志輸出

  • Logger抽象類提供了日志輸出接口,其子類LogFileObject是日志文件對象
    • 每個日志文件對應一個LogFileObject對象
    • LogFileObject對象提供日志文件的管理:創建新日志文件
  • LogDestination類提供了日志輸出接口
    • 通過靜態方法,提供全局性的日志輸出接口
    • 包含一個LogFileObject對象數組--每個日志級別對應一個日志文件
    • 除了日志文件之外,還提供多日志輸出渠道:終端、郵件、系統日志等


免責聲明!

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



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