本文是根據(jù)自己的理解翻譯組織了glog的manual,鑒于自身的理解能力和英語水平,可能存在謬誤,歡迎大家指出!英文原文見http://google-glog./svn/trunk/doc/glog.html
1. 概述
Google glog是一個基于程序級記錄日志信息的c++庫,編程使用方式與c++的stream操作類似,例:
LOG(INFO) << "Found " << num_cookies << " cookies";
“LOG”宏為日志輸出關鍵字,“INFO”為嚴重性程度。
主要支持功能:
1, 參數(shù)設置,以命令行參數(shù)的方式設置標志參數(shù)來控制日志記錄行為;
2, 嚴重性分級,根據(jù)日志嚴重性分級記錄日志;
3, 可有條件地記錄日志信息;
4, 條件中止程序。豐富的條件判定宏,可預設程序終止條件;
5, 異常信號處理。程序異常情況,可自定義異常處理過程;
6, 支持debug功能。可只用于debug模式;
7, 自定義日志信息;
8, 線程安全日志記錄方式;
9, 系統(tǒng)級日志記錄;
10, google perror風格日志信息;
11, 精簡日志字符串信息。
2. 功能使用
1.1 參數(shù)設置
可通過命令行方式設置glog的標志參數(shù),用來控制日志記錄行為。
命令格式如下:
標志名1 = 標志值 標志名2=標志值 …… 標志值n=標志值 ./程序名
所有標志名需添加統(tǒng)一前綴—“GLOG_”,不同標志語句之間以空格相隔;
例如:
-- GLOG_vmodule=mapreduce=2,file=1,gfs*=3 -- GLOG_v=0 ./application.exe
常用標志參數(shù)類型及其作用說明:
表1標志說明
還有其他的標志參數(shù)定義在logging.cc,可在文件中搜索“DEFINE_”來進行查看。
1.2 嚴重性分級記錄信息
glog可通過根據(jù)指定的嚴重性等級,來選擇性記錄日志。日志信息嚴重性等級按由低到高排列依次為:
INFO , WARNING , ERROR , 和 FATAL 四級。使用者可以在命令行中設置嚴重性等級門限值來控制日志的輸出,詳細見“參數(shù)設置”部分的“minloglevel ”標志值的介紹。1.3 有條件地記錄日志信息
glog可以控制日志信息在指定條件下進行記錄。具體使用如下:
1, LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; 上面的語句表示,只有當num_cookies > 10條件成立時,“Got lots of cookies”日志信息才被記錄。 2, LOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie"; 上面的語句表示,在程序中周期性的記錄日志信息,在該語句第1、11、21……次被執(zhí)行的時候,記錄日志信息。COUNTER變量表示該語句被執(zhí)行的次數(shù)。
3, LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER<< 上面的語句為1,2項功能的合并,size>1024的條件連續(xù)成立10次的時候記錄日志信息。COUNTER變量表示該條件成立的次數(shù)。
4, LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie"; 上面的語句表示,當該語句只在首次執(zhí)行了20次以后記錄日志信息, COUNTER變量表示該語句被執(zhí)行的次數(shù)。 1.4 有條件地中止程序
glog提供了CHECK宏,用于在調(diào)試地時候中止程序,及早發(fā)現(xiàn)程序錯誤。當通過該宏指定的條件不成立的時候,程序會中止,并且記錄對應的日志信息。功能類似于ASSERT,區(qū)別是CHECK宏不受NDEBUG約束,在release版中同樣有效。具體使用如下:
CHECK(fp->Write(x) == 4) << "Write failed!";
當fp->Write(x) == 4成立時,記錄“Write failed!”日志信息,并且中止程序,其中fp->Write(x) == 4為判定條件,日志信息以c++的stream操作形式生成。
glog提供了多個便利的宏來處理特定關系的判定。具體有:
1,判定大小關系 CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用這些宏需要注意類型一致,如果出現(xiàn)類型不一致的,可使用static_cast轉(zhuǎn)換。 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提供了比較方便的程序異常處理機制。例如,當程序出現(xiàn)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宏對應的嚴重性分級是獨立管理,在命令行參數(shù)設置中獨立設置“v”或“vmodule”參數(shù)來控制,具體見“參數(shù)設置”部分標志說明。VLOG宏便于用戶調(diào)試、查找完問題以后,屏蔽日志信息,減輕負擔。具體使用如下:
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成立時且命令行參數(shù)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;
上面的語句,只有在命令行參數(shù)v的值不小于1時,才會每執(zhí)行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;
上面的語句,只有在命令行參數(shù)v的值不小于1時,若size>1024條件連續(xù)成立10次,記錄一次日志信息。
1.8 線程安全日志記錄
glog提供了線程安全的日志記錄方式。在<glog/raw_logging.h>文件中提供了相關的宏,如,RAW_CHECK,RAW_LOG等。這些宏的功能與CHECK,LOG等一致,除此以外支持線程安全,不需要為其分配任何內(nèi)存和提供額外的鎖(lock)機制。
1.9 系統(tǒng)級日志記錄
glog除了提供了普通的日志記錄宏,還提供SYSLOG, SYSLOG_IF,和 SYSLOG_EVERY_N宏,這些宏將日志信息通過syslog()函數(shù)記錄到系統(tǒng)日志。
1.10 google perror風格日志信息
glog提供了與LOG*和CHECK宏作用等價的PLOG()、PLOG_IF() 和PCHECK()宏,不同的是,后者在記錄日志信息的時候,會將errno的狀態(tài)及其描述附加到日志描述中。
如:
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 精簡日志字符串信息
日志信息的字符串會占用比較大的內(nèi)存空間,另外還帶來隱私泄露的問題。glog提供了GOOGLE_STRIP_LOG宏在編譯時候去除日志的字符串信息。
3. 其他說明
1, windows平臺使用注意
因為glog的嚴重性級別中使用了ERROR宏,與<windows.h>文件中沖突,可通過以下兩種方式避免:
a,在包含<windows.h>文件之前,定義宏WIN32_LEAN_AND_MEAN 或者NOGDI。
b,在包含<windows.h>文件之后,undef掉ERROR定義。
|
|