google-glog類核心結構
圖片地址:https://github.com/yangdw/yangdw.tech.doc/blob/master/%E4%B8%93%E9%A2%98_%E5%BC%80%E6%BA%90%E5%BA%93/google-glog%E7%B1%BB%E5%85%B3%E7%B3%BB%E7%BB%93%E6%9E%84.jpg
git
工做原理
- 每一個日誌輸出都對應一個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++輸出流及日誌輸出github
C++輸出流
- LogMessage::LogStream類,日誌輸出流對象
- 繼承自std::ostream,接收日誌輸出
- 包含LogStreamBuf類數據成員
- LogStreamBuf,日誌輸出流緩存對象
- 繼承自std::streambuf,日誌輸出緩存
- 自己不建立日誌緩存區,構造函數時由參數傳入內存區
- LogMessage::LogMessageData結構,每一個LogMessage對象持有一個該結構對象
- Logger抽象類提供了日誌輸出接口,其子類LogFileObject是日誌文件對象
- 每一個日誌文件對應一個LogFileObject對象
- LogFileObject對象提供日誌文件的管理:建立新日誌文件
- LogDestination類提供了日誌輸出接口
- 經過靜態方法,提供全局性的日誌輸出接口
- 包含一個LogFileObject對象數組--每一個日誌級別對應一個日誌文件
- 除了日誌文件以外,還提供多日誌輸出渠道:終端、郵件、系統日誌等