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對象數組--每個日志級別對應一個日志文件
- 除了日志文件之外,還提供多日志輸出渠道:終端、郵件、系統日志等