glog入門demo


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


免責聲明!

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



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