glog
一. 下載與安裝
git clone https://github.com/google/glog.git
cd glog
./autogen.sh
./configure
make
make check
make install
二.glog簡單的使用說明
1. log的嚴重等級
等級描述 | 對應的等級數字 |
---|---|
INFO | 0 |
WARNING | 1 |
ERROR | 2 |
FATAL | 3 |
- 每一個等級都有一個對應的log輸出文件,默認文件名為(包含文件路徑) 為:
/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>
- 對於高嚴重的等級,不僅會把相應的log信息輸出到對應到等級文件中,還會輸出到比它更的log文件中, 例如對於ERROR等級的log,不僅會輸出到ERROR的文件中,還會輸出到INFO和WARNING的文件中。
- 對於ERROR和FATAL等級,不僅僅會把相關的log信息輸出到對應的文件中,還會把log信息輸出到standard error中, 默認就是屏幕上。
- 在release模式下,當產生了FATAL等級的log信息時,程序會被終止掉,在debug模式下,會自動把FATAL等級降至到ERROR等級, 也就是不會終止程序。
使用方法:
// 輸出INFO等級的log信息。
LOG(INFO) << "This is INFO severity log information. ";
// 輸出WARNING等級的log信息。
LOG(WARNING) << "This is WARNING severity log information. ";
// 輸出ERROR等級的log信息。
LOG(ERROR) << "This is ERROR severity log information. ";
// 輸出FATAL等級的log信息。
LOG(FATAL) << "This is FATAL severity log information. ";
2. 使用gflags在命令行中設置一些flag位.
在安裝glog時,如果你的電腦中已經安裝了gfalgs庫的話, 在編譯時,它會自動使用gflags庫,然后呢,當你使用glog庫時,就可以使用gflags庫的命令行特性了。(需要在main函數的開始處加上對gflags的初始化代碼gflags::ParseCommandLineFlags(&argc, &argv, true)
). 常使用到flags包含(更詳細看一下logging.cc文件):
- logtostderr(bool類型): 把日志信息輸出到stderr中,而不是文件中。 (在命令行中使用
--logtostderr=true 或 --logtostderr=false
) - stderrthreshold(int類型): 把嚴重等級>=指定等級的log信息額外輸出到stderr中(默認為2,即ERROR和FATAL)
- minloglevel (int 類型): 只有當嚴重等級>=指定等級時,會進行log的輸出。
3. Conditional/Occasional Logging
- LOG_IF(等級描述, 條件) << "日志信息"; 當條件滿足時,才會打印日志。
- LOG_EVERY_N(等級描述, n) << "日志信息"; 每n次會打印一條日志。
- LOG_IF_EVERY_N(等級描述, 條件, n) << "日志信息."; 當條件成立時,每n次打印一條日志。
- LOG_FIRST_N(等級描述, n) << "日志信息。"; 當打印前n次的日志信息。
4. debug 模式的支持
下面定義的宏只會在debug模式下起作用,在release模式下無效,這樣可以避免在release版本下打印日志影響運行速度。
- DLOG(等級描述) << "日志信息。";
- DLOG_IF(等級描述, 條件) << "日志信息";
- DLOG_EVERY_N(等級描述, n) << "日志信息";
5. CHECK 宏的使用
CHECK宏提供了一種機制:當條件不滿足時,程序直接終止掉, 類似於ASSERT宏。
宏的名字 | 作用 |
---|---|
CHECK_EQ(a,b) | 檢測a與b是否相等 |
CHECK_NE(a,b) | 檢測a與b是否不相等 |
CHECK_LE(a,b) | 檢測a是否小於或等於b |
CHECK_LT(a,b) | 檢測a是否小於b |
CHECK_GE(a,b) | 檢測a是否大於或等於b |
CHECK_GT(a,b) | 檢測a是否大於b |
CHECK_NOTNULL(指針) | 檢測指針不為空,它的返回值是傳給它的指針. 該宏不能像c++的輸出流那樣使用 |
使用方法:
CHECK_EQ(a,b) << " 當a與b不相等時,程序會中止運行,並打印出該條目志信息。";
特別注意:當指針與NULL進行比較時,編譯器會報錯,因為把NULL認為是0。 如果不想報錯,需要把NULL強轉換為指針類型(static_cast<指針類型>(NULL).
6. 用戶自己定義Failure Function
當產生FATAL的日志信息或CHECK宏檢測失敗時,程序就會終止掉,默認情況下glog會dump出堆棧的相關信息並以錯誤碼1退出程序的運行,我們可以注冊自定義的函數來運行你想要的函數。
// 第一步:定義自己的Failure函數
void MyFailureFunction()
{
/*
添加自己的代碼。
*/
exit(1);
}
// 第二步,在main函數的開始部分,加入一行如下代碼:
int main(int argc, char* argv[])
{
/*
其它初始化代碼。
*/
google::InstallFailureFunction(&MyFailureFunction);
}
7. Failure Signal Handler
可以自定義一些信號捕捉函數,然后通過google::InstallFailureSignalHandler()
函數來注冊一下。具體沒有深入研究。
三. 運行小小的demo
1. 創建文件glog_demo.cpp文件,內容如下:
#include <glog/logging.h>
int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
google::InitGoogleLogging(argv[0]);
LOG(INFO) << "This is INFO log information";
LOG(WARNING) << "This is WARNING log information";
LOG(ERROR) << "This is ERROR log information";
//LOG(FATAL) << "This is FATAL log information";
LOG_IF(INFO, 1 < 2) << "This is true: 1 < 2. ";
for (int i = 0; i < 100; ++i)
{
LOG_EVERY_N(INFO, 10) << "Log every 10 times. ";
}
CHECK(1 < 2) << "The world is end, because one is not less than 2. ";
return 0;
}
2. 編譯並運行
g++ glog_demo.cpp -o a.out -pthread -lgflags -lglog
./a.out glog_demo.cpp --logtostderr=true