本文是根據本身的理解翻譯組織了glog的manual,鑑於自身的理解能力和英語水平,可能存在謬誤,歡迎你們指出!英文原文見
http://google-glog.googlecode.com/svn/trunk/doc/glog.html
1. 概述
Google glog是一個基於程序級記錄日誌信息的c++庫,編程使用方式與c++的stream操做相似,例:
LOG(INFO) << "Found " << num_cookies << " cookies";
「LOG」宏爲日誌輸出關鍵字,「INFO」爲嚴重性程度。
主要支持功能:
1, 參數設置,以命令行參數的方式設置標誌參數來控制日誌記錄行爲;
2, 嚴重性分級,根據日誌嚴重性分級記錄日誌;
3, 可有條件地記錄日誌信息;
4, 條件停止程序。豐富的條件斷定宏,可預設程序終止條件;
5, 異常信號處理。程序異常狀況,可自定義異常處理過程;
6, 支持debug功能。可只用於debug模式;
7, 自定義日誌信息;
8, 線程安全日誌記錄方式;
9, 系統級日誌記錄;
10, google perror風格日誌信息;
11, 精簡日誌字符串信息。
2. 功能使用
1.1 參數設置
可經過命令行方式設置glog的標誌參數,用來控制日誌記錄行爲。
命令格式以下:
標誌名1 = 標誌值 標誌名2=標誌值 …… 標誌值n=標誌值 ./程序名
全部標誌名需添加統一前綴—「
GLOG_」,不一樣標誌語句之間以空格相隔;
例如:
-- GLOG_vmodule=mapreduce=2,file=1,gfs*=3 -- GLOG_v=0 ./application.exe
經常使用標誌參數類型及其做用說明:
標誌參數 |
類型 |
做用 |
logtostderr |
bool |
值爲true的時候,日誌信息輸出到stderr,並不是文件。默認值爲 false。 |
stderrthreshold |
int |
嚴重性級別在該門限值以上的日誌信息除了寫入日誌文件之外,還要輸出到stderr。各嚴重性級別對應的數值:INFO—0,WARNING—1,ERROR—2,FATAL—3
默認值爲2.
|
minloglevel |
int |
嚴重性級別在該門限值以上的日誌信息才進行記錄。
默認值爲0.
|
log_dir |
string |
日誌信息記錄路徑。默認爲空,若是沒有指定信息輸出到stderr,則信息保存在"/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>"文件中。 (e.g., "/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474").html |
v |
int |
對於使用「 VLOG(m) 」(m爲int型)表達式進行輸出的日誌信息,只在m的值小於該標誌的值的時候,才進行輸出。另外, 該設置可能被 vmodule標誌給覆蓋.默認爲0. |
vmodule |
string |
分模塊(文件)設置VLOG(m) 日誌信息的輸出基本。命令格式爲以逗號分開的「 <module name>=<log level>」表達式組成。其中 <module name> 是「glob pattern」,支持通配符,<module name>不包括文件的擴展名(.h,.cc等)。linux
|
表1標誌說明
還有其餘的標誌參數定義在logging.cc,可在文件中搜索「DEFINE_」來進行查看。
1.2 嚴重性分級記錄信息
glog可經過根據指定的嚴重性等級,來選擇性記錄日誌。日誌信息嚴重性等級按由低到高排列依次爲:
INFO
,
WARNING
,
ERROR
, 和
FATAL
四級。使用者能夠在命令行中設置嚴重性等級門限值來控制日誌的輸出,詳細見「參數設置」部分的「
minloglevel
」標誌值的介紹。
1.3 有條件地記錄日誌信息
glog能夠控制日誌信息在指定條件下進行記錄。具體使用以下:
1, LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";c++
上面的語句表示,只有當num_cookies > 10條件成立時,「Got lots of cookies」日誌信息才被記錄。編程
2, LOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";windows
上面的語句表示,在程序中週期性的記錄日誌信息,在該語句第一、十一、21……次被執行的時候,記錄日誌信息。COUNTER變量表示該語句被執行的次數。
3, LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER<<
"th big cookie";安全
上面的語句爲1,2項功能的合併,size>1024的條件連續成立10次的時候記錄日誌信息。COUNTER變量表示該條件成立的次數。
4, LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie";cookie
上面的語句表示,當該語句只在首次執行了20次之後記錄日誌信息, COUNTER變量表示該語句被執行的次數。app
1.4 有條件地停止程序
glog提供了CHECK宏,用於在調試地時候停止程序,及早發現程序錯誤。當經過該宏指定的條件不成立的時候,程序會停止,而且記錄對應的日誌信息。功能相似於ASSERT,區別是CHECK宏不受NDEBUG約束,在release版中一樣有效。具體使用以下:
CHECK(fp->Write(x) == 4) << "Write failed!";
當fp->Write(x) == 4成立時,記錄「Write failed!」日誌信息,而且停止程序,其中fp->Write(x) == 4爲斷定條件,日誌信息以c++的stream操做形式生成。
glog提供了多個便利的宏來處理特定關係的斷定。具體有:
1,斷定大小關係svn
CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用這些宏須要注意類型一致,若是出現類型不一致的,可以使用static_cast轉換。函數
2,斷定指針是否爲空
CHECK_NOTNULL(some_ptr),可用於對象初始化的時候。
3,斷定字符串是否相等
CHECK_STREQ
,
CHECK_STRNE
,
CHECK_STRCASEEQ
,
CHECK_STRCASENE
。可進行大小寫敏感或不敏感字符串來分別斷定。
4,
斷定浮點是否相等或相近
CHECK_DOUBLE_EQ
,CHECK_NEAR。這兩個宏都須要指定一個可容忍的誤差上限。
當這些宏斷定條件不成立時,glog會生成一個FATAL級別的日誌信息,該信息包含比較的兩個值和stream方式傳入的字符串,而後停止程序。
1.5 異常信號處理
glog提供了比較方便的程序異常處理機制。例如,當程序出現SIGSEGV異常信號時,glog的默認異常處理過程會導出很是有用的異常信息。異常處理過程能夠經過google::InstallFailureSignalHandler()來自定義。下面爲異常處理過程的輸出例子:
*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f892fb417d0 (unknown)
@ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f89304f7f06 google::LogMessage::SendToLog()
@ 0x7f89304f35af google::LogMessage::Flush()
@ 0x7f89304f3739 google::LogMessage::~LogMessage()
@ 0x408cf4 TestLogSinkWaitTillSent()
@ 0x4115de main
@ 0x7f892f7ef1c4 (unknown)
@ 0x4046f9 (unknown)
默認狀況下,異常信息是輸出到stderr,經過InstallFailureWriter()能夠改變輸出目標。
1.6 支持debug功能
glog提供特定的宏只在debug模式下生效。如下分別對應LOG、LOG_IF、DLOG_EVERY_N操做的專用宏。
DLOG(INFO) << "Found cookies";
DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";
1.7 自定義日誌信息
glog提供VLOG宏,讓用戶自定義分級信息,該分級與LOG宏對應的嚴重性分級是獨立管理,在命令行參數設置中獨立設置「v」或「vmodule」參數來控制,具體見「參數設置」部分標誌說明。VLOG宏便於用戶調試、查找完問題之後,屏蔽日誌信息,減輕負擔。具體使用以下:
VLOG_IF(1, (size > 1024))<< "I'm printed when size is more than 1024 and when you run the ""program with --v=1 or more";
上面的語句,只有在size>1024成立時且命令行參數v的值不小於1,才記錄日誌信息。
VLOG_EVERY_N(1, 10)<< "I'm printed every 10th occurrence, and when you run the program ""with --v=1 or more. Present occurence is " << COUNTER;
上面的語句,只有在命令行參數v的值不小於1時,纔會每執行10次記錄一第二天志信息。
VLOG_IF_EVERY_N(1, (size > 1024), 10)<< "I'm printed on every 10th occurence of case when size is more "" than 1024, when you run the program with --v=1 or more. "; "Present occurence is " << COUNTER;
上面的語句,只有在命令行參數v的值不小於1時,若size>1024條件連續成立10次,記錄一第二天志信息。
1.8 線程安全日誌記錄
glog提供了線程安全的日誌記錄方式。在<glog/raw_logging.h>文件中提供了相關的宏,如,RAW_CHECK,RAW_LOG等。這些宏的功能與CHECK,LOG等一致,除此之外支持線程安全,不須要爲其分配任何內存和提供額外的鎖(lock)機制。
1.9 系統級日誌記錄
glog除了提供了普通的日誌記錄宏,還提供SYSLOG, SYSLOG_IF,和 SYSLOG_EVERY_N宏,這些宏將日誌信息經過syslog()函數記錄到系統日誌。
1.10 google perror風格日誌信息
glog提供了與LOG*和CHECK宏做用等價的PLOG()、PLOG_IF() 和PCHECK()宏,不一樣的是,後者在記錄日誌信息的時候,會將errno的狀態及其描述附加到日誌描述中。
如:
PCHECK(write(1, NULL, 2) >= 0) << "Write NULL failed";
當條件不成立時,會輸出日誌信息:
F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) >= 0 Write NULL failed: Bad address [14]
1.11 精簡日誌字符串信息
日誌信息的字符串會佔用比較大的內存空間,另外還帶來隱私泄露的問題。glog提供了GOOGLE_STRIP_LOG宏在編譯時候去除日誌的字符串信息。
3. 其餘說明
1, windows平臺使用注意
由於glog的嚴重性級別中使用了ERROR宏,與<windows.h>文件中衝突,可經過如下兩種方式避免:
a,在包含<windows.h>文件以前,定義宏WIN32_LEAN_AND_MEAN 或者NOGDI。
b,在包含<windows.h>文件以後,undef掉ERROR定義。