Apollo中的glog
在Apollo中google glog 被廣泛使用,glog 是 google 的一個 c++ 開源日志系統,輕巧靈活,入門簡單,而且功能也比較完善。
1. 安裝
以下是官方的安裝方法,一句命令:
$ git clone https://github.com/google/glog.git
$ cd glog
$ ./autogen.sh && ./configure && make && make install
2. 使用
2.1 菜鳥級
從一個最簡單的程序開始:
#include <glog/logging.h> int main(int argc,char* argv[]) { google::InitGoogleLogging(argv[0]); //初始化 glog LOG(INFO) << "Hello,GOOGLE!"; }
編譯:
1. glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test #編譯 2. glog ./glog_test 3. glog ll /tmp #ll是小寫的L 4. glog cat /tmp/glog_test.INFO
這里 g++ 編譯的時候注意鏈接的庫是要按順序的(我也是才知道)。gcc 和 g++ 中庫的鏈接順序是從右往左進行,所以要把最基礎實現的庫放在最后,這樣左邊的 lib 就可以調用右邊的 lib 中的代碼。
一開始沒注意順序出現各種找不到函數,用 nm -C 定位了好久。而且這里我必須再鏈接上 gflags 才能成功編譯,看網上其他人都沒有。如果有大神知道為什么麻煩帶帶我。
這里沒有指定日志文件的目錄,默認會放在 /tmp 下,文件名的格式為 <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>。
2.2 新手級
日志文件的位置可以通過 gflags 命令行參數 log_dir 來指定,這時注意在 main 函數開始時初始化 gflags: google::ParseCommandLineFlags(&argc, &argv, true);,也可以直接在代碼里 指定 FLAGS_log_dir 的值。這里還是推薦標准的做法,即用命令行參數。
glog 的日志會根據日志嚴重性分級記錄日志,標准的分級為:INFO, WARNING, ERROR, FATAL。不同級別的日志信息會輸出到不同文件,同時高級別的日志也會寫入到低級別中。
再看個例子:
#include <glog/logging.h> int main(int argc,char* argv[]) { google::InitGoogleLogging(argv[0]); // 初始化 glog google::ParseCommandLineFlags(&argc, &argv, true); // 初始化 gflags LOG(INFO) << "Hello, GOOGLE!"; // INFO 級別的日志 LOG(ERROR) << "ERROR, GOOGLE!"; // ERROR 級別的日志 return 0; }
再次編譯運行:
glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test glog mkdir log # 建一個目錄放日志文件 glog ./glog_test -log_dir=./log glog ll log
這里可以看到,我們通過 log_dir 指定了日志存放目錄。而這里雖然我們沒有輸出 WARNING 級別的日志信息,但卻有該級別的日志。看一下分別是什么:
glog cd log
log cat glog_test.ERROR
log cat glog_test.WARNING
log cat glog_test.INFO
WARNING 級別的日志里放了 ERROR 的輸出信息,這就是我們說的高級別的日志會寫入到低級別中,而且是每個低級別。
還有一個常用的日志輸出語句,即自定義日志類型 VLOG。VLOG 的用法也很簡單,像這樣 VLOG(50) << "MY VLOG INFO";。這里的 50 只是自己定義的一個級別,事實上你可以定義任何一個數字,但一般越小的數字代表這條輸出日志越重要。通過命令行參數 -v 50 這樣子來指定 VLOG 輸出的級別,-v 50 意味着只有小於 50 以下的 VLOG 才會被輸出(這里不會影響 LOG(INFO)這些)。一般項目里越底層的庫使用越大數字的 VLOG 來打印調試信息,這樣可以使得日志不會被一堆底層庫的運行信息淹沒。
再看個例子:
#include <glog/logging.h>
int main(int argc,char* argv[]) { google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); LOG(INFO) << "Hello, GOOGLE!"; VLOG(100) << "VLOG INFO 100"; VLOG(50) << "VLOG INFO 50"; VLOG(10) << "VLOG INFO 10"; return 0; }
這里我們有三條 VLOG 信息,分別是 100 50 10 三個級別。VLOG 的信息只會出現在 INFO 級別的日志中:
glog g++ glog_test3.cpp -lglog -lgflags -lpthread -o glog_test glog ./glog_test -log_dir=./log -v 50 glog cat log/glog_test.INFO
我們可以看到,指定了 -v 50 后,只有小於等於 50 的 VLOG 及正常 LOG(INFO) 信息被打印出來。如果你問如果不指定會怎樣,回答就是一條 VLOG 信息都不會出現。
2.3進階版
如果你以為這里還有進階版介紹的話,我只能向你表示抱歉。我的使用只是簡單級別,目前項目也沒有必要更復雜的 glog 接口。
當然,我們也可以像其他博客把 glog 的功能全列出來:
- 參數設置,以命令行參數的方式設置標志參數來控制日志記錄行為
- 嚴重性分級,根據日志嚴重性分級記錄日志
- 可有條件地記錄日志信息
- 條件中止程序。豐富的條件判定宏,可預設程序終止條件
- 異常信號處理。程序異常情況,可自定義異常處理過程
- 支持debug功能。可只用於debug模式
- 自定義日志信息
- 線程安全日志記錄方式
- 系統級日志記錄
- google perror風格日志信息
- 精簡日志字符串信息
原文:https://blog.csdn.net/dinnerhowe/article/details/79911728
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
Apollo中的glog在Apollo中google glog 被廣泛使用,glog 是 google 的一個 c++ 開源日志系統,輕巧靈活,入門簡單,而且功能也比較完善。
1. 安裝以下是官方的安裝方法,一句命令:
git clone https://github.com/google/glog.gitcd glog ./autogen.sh && ./configure && make && make install1232. 使用2.1 菜鳥級從一個最簡單的程序開始:
#include <glog/logging.h>
int main(int argc,char* argv[]){ google::InitGoogleLogging(argv[0]); //初始化 glog LOG(INFO) << "Hello,GOOGLE!";}1234567編譯:
1. glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test #編譯2. glog ./glog_test3. glog ll /tmp #ll是小寫的L4. glog cat /tmp/glog_test.INFO 1234這里 g++ 編譯的時候注意鏈接的庫是要按順序的(我也是才知道)。gcc 和 g++ 中庫的鏈接順序是從右往左進行,所以要把最基礎實現的庫放在最后,這樣左邊的 lib 就可以調用右邊的 lib 中的代碼。
一開始沒注意順序出現各種找不到函數,用 nm -C 定位了好久。而且這里我必須再鏈接上 gflags 才能成功編譯,看網上其他人都沒有。如果有大神知道為什么麻煩帶帶我。
這里沒有指定日志文件的目錄,默認會放在 /tmp 下,文件名的格式為 <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>。
2.2 新手級日志文件的位置可以通過 gflags 命令行參數 log_dir 來指定,這時注意在 main 函數開始時初始化 gflags: google::ParseCommandLineFlags(&argc, &argv, true);,也可以直接在代碼里 指定 FLAGS_log_dir 的值。這里還是推薦標准的做法,即用命令行參數。
glog 的日志會根據日志嚴重性分級記錄日志,標准的分級為:INFO, WARNING, ERROR, FATAL。不同級別的日志信息會輸出到不同文件,同時高級別的日志也會寫入到低級別中。
再看個例子:
#include <glog/logging.h>
int main(int argc,char* argv[]){ google::InitGoogleLogging(argv[0]); // 初始化 glog google::ParseCommandLineFlags(&argc, &argv, true); // 初始化 gflags LOG(INFO) << "Hello, GOOGLE!"; // INFO 級別的日志 LOG(ERROR) << "ERROR, GOOGLE!"; // ERROR 級別的日志 return 0;}12345678910再次編譯運行:
glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_testglog mkdir log # 建一個目錄放日志文件glog ./glog_test -log_dir=./logglog ll log 1234這里可以看到,我們通過 log_dir 指定了日志存放目錄。而這里雖然我們沒有輸出 WARNING 級別的日志信息,但卻有該級別的日志。看一下分別是什么:
glog cd loglog cat glog_test.ERROR log cat glog_test.WARNING log cat glog_test.INFO1234WARNING 級別的日志里放了 ERROR 的輸出信息,這就是我們說的高級別的日志會寫入到低級別中,而且是每個低級別。
還有一個常用的日志輸出語句,即自定義日志類型 VLOG。VLOG 的用法也很簡單,像這樣 VLOG(50) << "MY VLOG INFO";。這里的 50 只是自己定義的一個級別,事實上你可以定義任何一個數字,但一般越小的數字代表這條輸出日志越重要。通過命令行參數 -v 50 這樣子來指定 VLOG 輸出的級別,-v 50 意味着只有小於 50 以下的 VLOG 才會被輸出(這里不會影響 LOG(INFO)這些)。一般項目里越底層的庫使用越大數字的 VLOG 來打印調試信息,這樣可以使得日志不會被一堆底層庫的運行信息淹沒。
再看個例子:
#include <glog/logging.h>
int main(int argc,char* argv[]){ google::InitGoogleLogging(argv[0]); google::ParseCommandLineFlags(&argc, &argv, true); LOG(INFO) << "Hello, GOOGLE!"; VLOG(100) << "VLOG INFO 100"; VLOG(50) << "VLOG INFO 50"; VLOG(10) << "VLOG INFO 10"; return 0;}123456789101112這里我們有三條 VLOG 信息,分別是 100 50 10 三個級別。VLOG 的信息只會出現在 INFO 級別的日志中:
glog g++ glog_test3.cpp -lglog -lgflags -lpthread -o glog_testglog ./glog_test -log_dir=./log -v 50glog cat log/glog_test.INFO123我們可以看到,指定了 -v 50 后,只有小於等於 50 的 VLOG 及正常 LOG(INFO) 信息被打印出來。如果你問如果不指定會怎樣,回答就是一條 VLOG 信息都不會出現。
2.3進階版如果你以為這里還有進階版介紹的話,我只能向你表示抱歉。我的使用只是簡單級別,目前項目也沒有必要更復雜的 glog 接口。
當然,我們也可以像其他博客把 glog 的功能全列出來:
參數設置,以命令行參數的方式設置標志參數來控制日志記錄行為嚴重性分級,根據日志嚴重性分級記錄日志可有條件地記錄日志信息條件中止程序。豐富的條件判定宏,可預設程序終止條件異常信號處理。程序異常情況,可自定義異常處理過程支持debug功能。可只用於debug模式自定義日志信息線程安全日志記錄方式系統級日志記錄google perror風格日志信息精簡日志字符串信息--------------------- 作者:DinnerHowe 來源:CSDN 原文:https://blog.csdn.net/dinnerhowe/article/details/79911728 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
