http://blog.51cto.com/mengjh/546766
標志參數
|
類型
|
作用
|
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"). |
v
|
int
|
對於使用“
VLOG(m)
”(m為int型)表達式進行輸出的日志信息,只在m的值小於該標志的值的時候,才進行輸出。另外, 該設置可能被 vmodule標志給覆蓋.默認為0.
|
vmodule
|
string
|
分模塊(文件)設置 |
INFO
,
WARNING
,
ERROR
, 和
FATAL
四級。使用者可以在命令行中設置嚴重性等級門限值來控制日志的輸出,詳細見“參數設置”部分的“
minloglevel
”標志值的介紹。
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";
3, LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER<<
"th big cookie";
4, LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie";
上面的語句表示,當該語句只在首次執行了20次以后記錄日志信息, COUNTER變量表示該語句被執行的次數。
1,判定大小關系
CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用這些宏需要注意類型一致,如果出現類型不一致的,可使用static_cast轉換。
2,判定指針是否為空
3,判定字符串是否相等
CHECK_STREQ
,
CHECK_STRNE
,
CHECK_STRCASEEQ
,
CHECK_STRCASENE
。可進行大小寫敏感或不敏感字符串來分別判定。
4,
判定浮點是否相等或相近
CHECK_DOUBLE_EQ
,CHECK_NEAR。這兩個宏都需要指定一個可容忍的偏差上限。
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f89304f7f06 google::LogMessage::SendToLog()
@ 0x7f89304f3739 google::LogMessage::~LogMessage()
@ 0x4046f9 (unknown)
DLOG(INFO) << "Found cookies";
DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";
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]
glog安裝及使用
作者:littlewhite
安裝
推薦從源碼安裝,下載地址https://code.google.com/p/google-glog/downloads/list
下載解壓后進入目錄,和所有Linux程序的安裝步驟一樣
./configuer
make
make install
如果沒有權限請在命令前加上sudo,如果想安裝在指定目錄,使用./configuer --prefix=your_dir
使用
glog的使用簡單到令人發指
現有測試程序test.cpp如下
#include <glog/logging.h>
int main(int argc, char* argv[])
{
google::InitGoogleLogging(argv[0]);
LOG(INFO) << "info: hello world!";
LOG(WARNING) << "warning: hello world!";
LOG(ERROR) << "error: hello world!";
VLOG(0) << "vlog0: hello world!";
VLOG(1) << "vlog1: hello world!";
VLOG(2) << "vlog2: hello world!";
VLOG(3) << "vlog3: hello world!";
DLOG(INFO) << "DLOG: hello world!";
return 0;
}
假設你的glog庫的路徑為/usr/local/lib/libglog.a,頭文件路徑為/usr/local/include/glog/logging.h,那么編譯命令如下
g++ test.cpp -o test -L/usr/local/lib -lglog -I/usr/local/include/glog
執行如下命令
GLOG_logtostderr=1 ./test
看看是不是將日志打印到屏幕上了,但是你會發現有些日志沒有打印出來。接下來我來一一解釋
日志級別
使用日志必須了解日志級別的概念,說白了就是將日志信息按照嚴重程度進行分類,glog提供四種日志級別:INFO, WARNING, ERROR, FATAL。它們對應的日志級別整數分別為0、1、2、3, 每個級別的日志對應一個日志文件,其中高級別的日志也會出現在低級別的日志文件中,也就是說FATAL日志會出現在INFO、WARNING、ERROR對應的日志文件中。FATAL日志會終止程序,沒事別亂用。
日志文件
glog的日志文件默認是保存在/tmp目錄下的,當然你可以指定日志路路徑和日志名稱
指定日志文件名字
google::InitGoogleLogging(argv[0])
你也可以指定其它字符串,比如本例指定的名字為test,那么日志文件就是test.INFO, test.WARNING這樣的格式
指定參數
glog可以采用命令行的模式配置參數,這也是它靈活易用的體現,有兩種指定參數的方法,一種依賴於gflag如下:
./your_application --logtostderr=1
或者通過環境變量指定:
GLOG_logtostderr=1 ./your_application
所有的環境變量均以GLOG_開頭,我們推薦使用第二種,一來不必依賴於gflag,二來當參數很多時,可以寫成腳本的形式,看起來更直觀,GLOG支持的flag如下(只列出常用的,如果想看全部的,可以在源碼的logging.cc文件下看到):
GLOG_logtostderr
bool,默認為FALSE,將日志打印到標准錯誤,而不是日志文件
GLOG_alsologtostderr
bool,默認為FALSE,將日志打印到日志文件,同時也打印到標准錯誤
GLOG_stderrthreshold
int,默認為2(ERROR),大於等於這個級別的日志才打印到標准錯誤,當指定這個參數時,GLOG_alsologtostderr參數將會失效
GLOG_minloglevel
int,默認為0(INFO), 小於這個日志級別的將不會打印
GLOG_log_dir
string類型,指定日志輸出目錄,目錄必須存在
GLOG_max_log_size
int,指定日志文件最大size,超過會被切割,單位為MB
GLOG_stop_logging_if_full_disk
bool,默認為FALSE,當磁盤滿了之后不再打印日志
GLOG_v
int,默認為0,指定GLOG_v=n時,對vlog(m),當m<=n時才會打印日志
知道了這些參數之后,我們可以在腳本中指定這些變量,還是以test程序為例,test.sh如下:
#!/bin/sh
export GLOG_log_dir=log
export GLOG_minloglevel=1
export GLOG_stderrthreshold=1
export GLOG_v=3
export GLOG_max_log_size=1
./test
執行腳本sh test.sh即可。這樣看上去就非常清晰,修改起來也方便
打印日志
普通模式
LOG(INFO) << "info: hello world!";
打印日志為INFO級別
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
滿足num_cookies > 10時,打印日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
當日志語句被執行的第1次、11次、21次...時打印日志,其中google::COUNTER代表的是被執行的次數
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie";
以上兩者的組合
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";
顧名思義,前20次執行的時候打印日志
debug模式
debug模式的語句如下
DLOG(INFO) << "Found cookies";
DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
當編譯的時候指定-D NDEBUG時,debug日志不會被輸出,比如test.cpp的編譯命令改為
g++ test.cpp -o test -L/usr/local/lib -lglog -I/usr/local/include/glog -D NDEBUG
那么就不會有debug日志輸出
check模式
CHECK( fd != NULL ) << " fd is NULL, can not be used ! ";
當check的條件不成立時,程序打印完日志之后直接退出,其它命令包括CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT。以CHECK_EQ為例,適用方式如下
CHECK_NE(1, 2) << ": The world must be ending!";
自定義日志級別
VLOG(1) << "vlog1: hello world!";
VLOG(2) << "vlog2: hello world!";
這個是獨立於默認日志級別的,可以配合GLOG_v參數適用
總結
GLOG使用就是如此方便,你只需要在代碼里指定日志文件名,然后就可以放心的在代碼里添加日志而不需要管那些初始化和銷毀的操作,其它都可以以命令行的方式來配置,簡單靈活,而且基本功能也比較齊全。另外,如果想了解GLOG詳細適用,可以參考官方文檔http://google-glog.googlecode.com/svn/trunk/doc/glog.html
=======================================================================================================================================================================
http://www.cnblogs.com/caolisong/archive/2007/04/25/726896.html
linux shell 中"2>&1"含義
腳本是:
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
對於& 1 更准確的說應該是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,實際上這個操作就是一個dup2(2)調用.他標准輸出到all_result ,然后復制標准輸出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一個文件表項,也可以說錯誤的輸出被合並了.其中0表示鍵盤輸入 1表示屏幕輸出 2表示錯誤輸出.把標准出錯重定向到標准輸出,然后扔到/DEV/NULL下面去。通俗的說,就是把所有標准輸出和標准出錯都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是將command的輸出重定向到out.file文件,即輸出內容不打印到屏幕上,而是輸出到out.file文件中。2>&1 是將標准出錯重定向到標准輸出,這里的標准輸出已經重定向到了out.file文件,即將標准出錯也輸出到out.file文件中。最后一個& , 是讓該命令在后台執行。
試想2>1代表什么,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個文件1,而不代表標准輸出;
換成2>&1,&與1結合就代表標准輸出了,就變成錯誤重定向到標准輸出.
你可以用
ls 2>1測試一下,不會報沒有2文件的錯誤,但會輸出一個空的文件1;
ls xxx 2>1測試,沒有xxx這個文件的錯誤輸出到了1中;
ls xxx 2>&1測試,不會生成1這個文件了,不過錯誤跑到標准輸出了;
ls xxx >out.txt 2>&1, 實際上可換成 ls xxx 1>out.txt 2>&1;重定向符號>默認是1,錯誤和輸出都傳到out.txt了。
為何2>&1要寫在后面?
command > file 2>&1
首先是command > file將標准輸出重定向到file中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。
command 2>&1 >file
2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>file 后輸出才被重定向到file,但標准錯誤仍然保持在終端。
用strace可以看到:
1. command > file 2>&1
這個命令中實現重定向的關鍵系統調用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)
2. command 2>&1 >file
這個命令中實現重定向的關鍵系統調用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)
可以考慮一下不同的dup2()調用序列會產生怎樣的文件共享結構。請參考APUE 3.10, 3.12
===================================================================================================================================================
https://unix.stackexchange.com/questions/20469/difference-between-21-output-log-and-21-tee-output-log
Difference between 2>&1 > output.log and 2>&1 | tee output.log
問題:
I wanted to know the difference between the following two commands
2>&1 > output.log
and
2>&1 | tee output.log
I saw one of my colleague use second option to redirect. I know what 2>&1 does, my only question is what is the purpose of using tee where a simple redirection ">" operator can be used?
回答:
2>&1 >output.log
means first start sending all file handle 2 stuff (standard error) to file handle 1 (standard output) then send that to the file output.log
. In other words, send standard error and standard output to the log file.
2>&1 | tee output.log
is the same with the 2>&1
bit, it combines standard output and standard error on to the standard output stream. It then pipes that through the tee
program which will send its standard input to its standard output (like cat
) and also to the file. So it combines the two streams (error and output), then outputs that to the terminal and the file.
The bottom line is that the first sends stderr
/stdout
to the file, while the second sends it to both the file and standard output (which is probably the terminal unless you're inside another construct which has redirected standard output).
I mention that last possibility because you can have stuff like:
(echo hello | tee xyzzy.txt) >plugh.txt
where nothing ends up on the terminal.
---------------------------1 You have the syntax right, but not the semantics. Run cat /doesnotexist 2>&1 >output.txt
- you will see see cat: /doesnotexist: No such file or directory
displayed to the terminal and output.txt is an empty file. Order of precedence and closure are in play: 2>&1
(dup fd2 from the current fd1), then >output.txt
(redirect fd1 to output.txt, not changing anything else). The reason that 2>&1 |
is different is because of order of precedence: |
before >
. – Arcege Sep 10 '11 at 23:33
First command will do the another task:
After
2>&1 > output.log
the old STDOUT will be saved (copied) in STDERR and then STDOUT will be redirected to file.
So, stdout will go to file and stderr will go to console.
And in
2>&1 | tee output.log
both streams will be redirected to tee. Tee will duplicate any input to its stdout (the console in your case) and to file (output.log
).
And there is another form of first:
> output.log 2>&1
this will redirect both STDOUT and STDERR to the file.
===============================================================================================================================
http://luofeilong.github.io/2015/09/13/glog-study-0/
如何使用google日志庫(glog)
每個軟件都會對自身的運作情況進行一些記錄,這些信息將會保存到日志文件中,以便分析運行狀態和定位bug。因此我們都需要有一個日志庫,簡單而強大。
或許很多人都自己寫過日志類,支持多線程寫入,支持自定義存放目錄,支持日志等級控制,支持文件前綴自定義,支持每天生成一個文件,支持日志文件最大大小控制等等。。。
這里就介紹一下google的日志庫glog,主要是翻譯了官網的說明文檔。
如何使用google日志庫(glog)
引言
google glog是一個實現應用級日志的庫,提供了基於c++風格的流式和輔助宏的API接口。你可以簡單地通過流式操作使用LOG(level)來記錄日志,例如:
|
google glog定義了一系列宏來簡化許多常用的日志操作。你可以使用日志等級來控制所需要記錄的日志信息,可以使用命令行來控制日志行為,可以基於條件來記錄日志,可以在預設條件不滿足的時候終止程序,可以引進你自己的詳細日志等級等等。本文描述的就是glog所提供的功能,但是請注意,本文並不是對glog庫的所有特性進行詳盡描述,而是只對最常用的特性進行描述。如果你想知道一些不是很常用的特性,那么請查看src/glog目錄下的頭文件。
嚴重等級
在使用過程中,你可以指定以下幾種嚴重等級之一(嚴重級別以遞增的方式): INFO,WARNING,ERROR和FATAL。當一個fatal級別的日志被記錄后,程序將會被終止。需要注意的是,一個指定嚴重級別的日志不單單會在同等嚴重級別的日志文件中記錄,同時也會在所有低於該等級的日志文件中記錄。例如,一個fatal級別的日志會記錄在fatal、error、warning或info級別的日志文件中。
DFATAL級別是在debug模式(即,沒有定義NDEBUG宏)下的FATAL級別錯誤,但是卻可以在生產環境中通過自動降級為ERROR級別來避免程序被終止。
除了額外指定外,glog默認會將日志寫入到以下這個路徑中
/tmp/program name.hostname.user name.log.severity level.date.time.pid (例如: “/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474”)。
默認情況下,glog除了會將ERROR或FATAL級別的錯誤寫入到日志文件中,同時也會將這兩個級別的日志復制到標准錯誤輸出中。
設置標志
有幾種標志可以影響到glog的輸出行為。如果你的電腦中安裝了google gflags庫,當你使用命令行的方式將標志傳遞給程序時,configure腳本會自動檢測並使用這些標志。例如,如果你想使用–logtostderr標志,那么可以像下面這樣來運行你的程序:
./your_application --logtostderr=1 |
如果你沒有安裝google gflags庫,那么你可以通過環境變量來設置標志,但是標志名稱必須以”GLOG_”開頭,例如:
GLOG_logtostderr=1 ./your_application |
以下是最常用的幾種標志:
logtostderr (bool, default=false)
將日志輸出到stderr,而不是輸出到日志文件
注意:你可以使用1、true或yes來將二進制標志設置成true。同樣,你可以使用0、false或no來將二進制標志設置為false。
stderrthreshold (int, default=2, which is ERROR)
將等於或高於該嚴重等級的日志復制到stderr,而不是日志文件。INFO、WARNING、ERROR和FATAL嚴重級別分別對應着0、1、2和3。
minloglevel (int, default=0, which is INFO)
記錄等於或高於該嚴重級別的日志信息。同樣,INFO、WARNING、ERROR和FATAL嚴重級別分別對應着0、1、2和3。
log_dir (string, default=””)
調用該函數后,日志將會保存在指定的目錄,而不是默認目錄
v (int, default=0)
顯示所有VLOG(m)中所有小於或等於m嚴重等級的信息。可以通過–vmodule進行重寫。具體內容可以查看關於日志詳細記錄部分。
vmodule (string, default=””)
指定每個模塊的日志級別。參數必須使用[module name]=[log level]的形式,並且中間以逗號進行分隔。[module name]其實可以是一個通配格式(例如,gfs*其實代表的是所有以gfs開頭的模塊),根據文件名來匹配(但是卻跳過了文件名中的某些后綴 .cc/.//-inl.h)。[log level]會覆蓋所有通過–v來指定的值。
除了上面說到的這些標志外,還有一些其他標志定義在logging.cc文件中。可以通過所有關鍵字”DEFINE_”來找到所有的標志。
你可以在程序中通過修改FLAGS*系列的變量來修改標志的值。大部分FLAGS*標志在被更新后會馬上生效,但是與目標文件相關的標志卻不是這樣的。例如,你可能想在調用google::InitGoogleLogging之前就設置FLAGS_log_dir。下面就是一個例子代碼:
LOG(INFO) << "file"; |
條件型/臨時型日志
有些時候,你可能想在某些條件成立的時候才去記錄日志。在這種情況下,你可以使用下面這樣的方式來達到目的:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; |
上面代碼表示的意思是,在變量num_cookies大於10的時候記錄一條”Got lots of cookies”日志。有時候某行代碼被執行多次,但是我們想在執行次數超過某個值時記錄一條日志。這種情況,我們可以使用下面這種方式來記錄:
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; |
上面這行代碼的作用是,當這行代碼被指定的第1、11、21次(等等)的時候將會記錄一條日志。需要注意的是,google::COUNTER是用來記錄當前發生了第幾次。
當然,你也可以同時使用條件型和臨時型日志,例如:
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER<< "th big cookie"; |
有時候為了防止每隔n次調用時就輸出一條日志的情況,我們也是可以通過限定最多輸出前面多少次日志:
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; |
上面的處理是,當最先20次發生時才會輸出日志,同樣,次數是由google::COUNTER來計算的。
調試模式支持
“debug mode”日志宏只會在調試模式下才能生效,非調試模式下就沒有任何日志輸出。使用這些宏可以避免由於過度的日志輸出導致的程序性能下降。
DLOG(INFO) << "Found cookies"; |
CHECK宏
在程序中檢查我們的期望條件是一個很好的做法,這樣能夠讓我們盡早發現程序中的錯誤。而CHECK宏提供了在條件不滿足時終止程序的能力,就像標准C庫中的assert宏一樣。
當某個條件不為true時,CHECK宏會終止程序運行。但是它不像assert宏,它不受非debug模式的控制,所以不管在何種模式下都會有效果。因此,在下面這個例子中,fp->Write(x)是一直有效的:
CHECK(fp->Write(x) == 4) << "Write failed!"; |
除了上面說的check宏,還有一些用於檢查等於/不等於的宏 - CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, and CHECK_GT.這些宏都是比較兩個參數值的,當結果不滿足預想條件時將會記錄一條FATAL錯誤日志,同時會將兩個比較變量的值也記錄在日志中,但是前提是兩個比較變量值類型必須支持操作符<<。
通過下面這樣使用,你可以在日志文件中增加一條日志:
CHECK_NE(1, 2) << ": The world must be ending!"; |
我們非常小心謹慎去確保每個參數都被檢查一次,因此所有能夠作為函數的合法參數對象在這里都是合法的。特別是,參數可能是臨時變量參數表達式。例如:
CHECK_EQ(string("abc")[1], 'b'); |
如果其中一個參數是指針,而另外一個卻是NULL的話,編譯器會報告一個錯誤。為了能夠正常工作,可以簡單地調用static_cast將NULL轉換為對應類型指針。
CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL)); |
更好的是,我們可以使用CHECK_NOTNULL宏:
CHECK_NOTNULL(some_ptr); |
由於該宏返回的是一個已存在的指針,所以這個宏構造函數初始化列表中非常有用。
struct S { |
但是要注意的是,你不能使用該宏來作為C++流。請使用上面描述的CHECK_EQ宏來在終止程序前進行日志記錄。
如果你正在比較string值,那么這里也有一系列的宏可以使用 - CHECK_STREQ, CHECK_STRNE, CHECK_STRCASEEQ, and CHECK_STRCASENE. 而CASE版本是區分大小寫的,你可以非常放心地將NULL指針傳遞給這些宏,他們會將NULL和非NULL字符串判斷為不相等的,而兩個NULL就判斷為相等。
注意,兩個參數都可能是一個由函數返回的臨時字符串。
CHECK_DOUBLE_EQ宏用來檢查兩個浮點數值是否相等,並且允許兩個值有很小的誤差。CHECK_NEAR卻能接收第三個浮點數,同時也是允許存在一個小的誤差值。
詳細記錄
當你在跟蹤調試一個很復雜的bug,那么詳細的日志信息是很有幫助的。但是你可能又想在非開發環境下避免輸出這些太詳細的日志。對於詳細日志,glog提供了VLOG宏,這個宏允許你自定義自己的日志等級。使用命令行參數–v可以控制輸出哪些詳細日志。
VLOG(1) << "I'm printed when you run the program with --v=1 or higher"; |
在使用VLOG的時候,我們定義詳細日志等級越低,那么將會有更多的可能信息將會被輸出到日志文件中。例如,如果我們調用VLOG的時候設置–v==1,那么VLOG(1)將會記錄日志,但是VLOG(2)將不會被記錄日志。這個和嚴重等級剛好是相反的。
每一個模塊都能通過命令行控制詳細日志的輸出:
--vmodule=mapreduce=2,file=1,gfs*=3 --v=0 |
以上命令行參數指定了一系列的輸出等級:
- a.mapreduce模塊中的VLOG(2)或者更低級別日志將會被輸出
- b.文件中的VLOG(1)或者更低級別的日志將會被輸出
- c.前綴為gfs的文件中VLOG(3)或者更低級別的日志將會被輸出
- d.其他情況下的VLOG(0)或更低級別日志將會被輸出
以上顯示了可以使用通配符,不但支持*號通配,同時也支持?通配符。
這里也有基於條件的宏VLOG_IS_ON(n),當參數–v參數值等於或者大於n時,該宏將會返回true值。例如下面使用方式:
if (VLOG_IS_ON(2)) { |
詳細級別的條件宏VLOG_IF, VLOG_EVERY_N和VLOG_IF_EVERY_N,他們的功能表現類似於LOG_IF, LOG_EVERY_N和LOF_IF_EVERY,但是他們接受一個數字型的詳細等級而不是嚴重等級。
VLOG_IF(1, (size > 1024)) |
失敗信號處理
該庫提供了一個方便的程序異常信號處理器,就是當程序出現異常信號(例如SIGSEGV)出現時,該庫會將有用程序的有用信息都轉儲出來。該信號處理器可以通過google::InstallFailureSignalHandler()進行安裝。下面代碼就是該異常信號處理器的輸出內容例子:
*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date *** |
默認情況下,該異常處理器會將異常信息都輸出到標准錯誤輸出中。你可以通過InstallFailureWriter()來自定義異常信息輸出目標。
其他注意項
消息性能
glog中提供的條件日志宏在使用過程中需要小心,因為當條件false的時候,右邊表達式並不會被執行。
CHECK(obj.ok) << obj.CreatePrettyFormattedStringButVerySlow(); |
自定義失敗處理函數
FATAL嚴重級別日志和未滿足條件的CHECK宏都會終止你的程序,但是你可以通過InstallFailureFunction函數來修改終止的行為。
void YourFailureFunction() { |
默認情況下,glog會嘗試將堆棧信息都轉存出來,並設置程序退出碼為1.當然,這個堆棧跟蹤的前提是你的程序支持才行。
原始日志
文件中定義了線程安全的日志操作,這些操作不會申請任何的內存或獲取任何的鎖。因此,在這個頭文件中定義的這些宏能夠用於低級別的內存申請和同步代碼。具體請查看src/glog/raw_logging.h中的代碼。
google風格的perror()
PLOG()、PLOG_IF()和PCHECK()的表現與LOG*、CHECK非常相似。例如
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] |
Syslog
SYSLOG, SYSLOG_IF和SYSLOG_EVERY_N這幾個宏都是可以使用的,而這些syslog日志是對普通日志的一個增加。但是要注意,syslog系列日志操作會對性能有較大影響,特別是當syslog用於遠程記錄日志時。在你使用這些宏之前,確保你已經明確了解了這些宏的含義。一般來說,謹慎使用這些宏是明智的選擇。
windows用戶須知
google的glog定義了一個嚴重級別ERROR,這個級別宏同事也在windows.h文件中定義了。你在通過在包含glog/logging.h之前定義宏GLOG_NO_ABBREVIATED_SEVERITIES,這樣就能使得glog不去定義INFO, WARNING, ERROR和FATAL這幾個宏了。就算使用了這個宏,你還是可以想日志工具一樣使用iostream。
# |
但是,在使用glog/logging.h中定義的函數的時候,你再也不能使用這個宏(INFO, WARNING, ERROR,FATAL)了。
# |
如果你不需要使用windows.h中定義的ERROR宏,這里還有幾種方法可以實現的:
* |