glog簡介
Google glog is a library that implements application-level logging. This library provides logging APIs based on C++-style streams and various helper macro.
- 參數設定,以指令行參數的方式設定标志參數來控制日志記錄行為;
- 嚴重性分級,根據日志嚴重性分級記錄日志;
- 可有條件地記錄日志資訊;
- 條件中止程式。豐富的條件判定宏,可預設程式終止條件;
- 異常信号處理。程式異常情況,可自定義異常處理過程;
- 支援debug功能;
- 自定義日志資訊;
- 線程安全日志記錄方式;
- 系統級日志記錄;
- google perror風格日志資訊;
- 精簡日志字元串資訊
安裝 和 使用
下載下傳位址:
https://code.google.com/p/google-glog/downloads/list
解壓安裝:
tar zxvf glog-.tar.gz && cd glog- && ./configure && make
頭檔案目錄為 /src/glog ,連結庫為 .libs/libglog.{a,so}
幫助文檔為 doc/glog.html 或直接通路以下 URL: http://google-glog.googlecode.com/svn/trunk/doc/glog.html
簡單Demo
#include <glog/logging.h>
int main(int argc,char* argv[])
{
LOG(INFO) << "Hello,GLOG!";
}
隻需要include logging.h頭檔案 連結時,需要 -lglog -lpthread
主要内容
日志
日志等級
enum SeverityLevel
{
google::INFO = ,
google::WARNING = ,
google::ERROR = ,
google::FATAL = ,
};
在輸出FATAL日志消息後,會終止程式運作
DEBUG模式中,DFATAL級别對應ERROR–便于調試,而非DEBUG模式則對應FATAL
日志檔案
每個級别都對應有相應的日志檔案,日志檔案的位置及名稱定義如下:
- windows下是”C:\Users\user_name\AppData\Local\Temp”
- Linux是”/tmp”
檔案名稱:
programname.hostname.user_name.log.severity_level.date.time.pid
Linux還會建立為每個檔案建立一個檔案連結
如果日志輸出超過 FLAGS_max_log_size 設定的大小,則會分為多個檔案存儲,連結檔案就會指向其中最新的對應級别的日志檔案。是以當日志檔案較多時,檢視連結檔案來檢視最新日志挺友善的。
輸出規則:
- 每個級别的日志除了輸出到對應日志檔案中,還輸出到每個低級别日志檔案中
- 如一個ERROR日志,會輸出到INFO,WARNING,ERROR三個日志檔案中
- 預設,ERROR和FATAL消息除了輸出到日志檔案中之外,還會輸出到标準錯誤中
符号變量
通過符号變量可以定制日志行為
在程式中,通過修改全局變量(使用字首”FLAGS_”)來設定符号變量
- 大多數符号變量修改後會立即生效
- 與輸出位置有關(如FLAGS_log_dir),如果要生效需要在google::InitGoogleLogging()之前設定
列舉符号變量
(可參見源碼src/glog/logging.h line:321-361):
- logtostderr(bool,default=false),隻輸出到STDERR而不寫入日志檔案
- stderrthreshold(int,default=ERROR),高于該級别的日志除寫入日志檔案還輸出到STDERR
- minloglevel(int,default=INFO),低于該級别的日志消息不輸出
- colorlogtostderr(bool, default=false),将輸出到 stderr 上的錯誤日志顯示相應的顔色
- log_dir(string,default=”“),日志輸出目錄
- v(int,default=0),小于等于該值的VLOG(m)會被輸出,否則不會輸出
- vmodule(string,default=”“),可為源檔案定制VLOG日志輸出級别
- max_log_size(int,default=1800),日志檔案最大值(機關MB)
- log_link(string,default=”“),日志檔案的連接配接所在的檔案夾
- stop_logging_if_full_disk(bool,default=false),如果磁盤寫滿是否停止記錄日志
- alsologtoemail(string,default=”“),是否将日志額外發送郵件到指定位址
- logemaillevel(int,default=999),設定發送郵件的日志等級
- logmailer(string,default=”/bin/mail”),發送郵件程式
APIs
-
void google::InitGoogleLogging(const char* argv0)
初始化glog庫,參數是第一個指令行參數即程式名
-
void google::ShutdownGoogleLogging()
關閉glog庫
-
void google::FlushLogFiles(LoSeverity min_severity)
[Thread-safe]指定級别以上的所有日志消息都立即寫入到日志檔案
-
void google::FlushLogFilesUnsafe(LogSeverity min_severity)
非線程安全的輸出指定級别以上的日志消息,用于災難性程式問題時輸出必要的日志消息
-
void google::SetLogDestination(LogSeverity severity,const char*
base_filename)
[Thread-safe]設定指定級别的日志輸出的日志檔案,如果base_filename為”“則表示該級别日志不輸出
-
void google::SetLogSymlink(LogSeverity severity,const char*
symlink_basename)
[Thread-safe]設定置頂級别的日志檔案的軟連接配接,symlik_basename為空表示不設定軟連接配接。如果不調用該函數,系統預設連接配接名稱是程式名
-
void google::AddLogSink(LogSink *destination)
void google::RemoveLogSink(LogSink *destination)
Thread-safe]添加和删除日志輸出管道
-
void google::SetLogFilenameExtension(const char* filename_extension)
[Thread-safe]為所有日志檔案添加檔案擴充名,特别用于SetLogDestination()設定的日志檔案
通常做法是将監聽的端口号作為日志檔案擴充名
-
void google::SetStderrLogging(LogSeverity
min_severity)
[Thread-safe]确定除了輸出到日志檔案同時還輸出到STDERR的日志最小級别
-
void google::LogToStderr()
[Thread-safe]設定隻隻将日志輸出到STDERR而不輸出到日志檔案
-
void google::SetEmailLogging(LogSeverity min_severity,const char* address)
[Thread-safe]設定發送郵件的日志最小級别
-
bool google::SendEmail(const char dest,const char subject,const char *body)
[Thread-safe]發送郵件
-
const std::vector& google::GetLoggingDirectories()
擷取日志輸出目錄集合
-
void google::InstallFailureSignalHandler()
信号處理函數,處理的主要信号有SIGSEGV/SIGILL/SIGFPE/SIGBRT/SIGBUS/SIGTERM
-
void google::InstallFailureWriter(void (writer)(const char data,int size))
設定系統崩潰時的輸出函數,data資料不一定是以’\0’結尾
-
void google::InstallFailureFunction(void (*fail_func)())
設定LOG(FATAL)在輸出日志消息後調用的函數
處理core dumped
通過 google::InstallFailureSignalHandler()注冊,預設捕捉 SIGSEGV 信号資訊輸出會輸出到 stderr;
通過 google::InstallFailureFunction(void (*func)())定制錯誤處理
通過 google::InstallFailureWriter(void (writer)(const char data,int size)) 自定義輸出方式,例如:
#include <glog/logging.h>
#include <string>
#include <fstream>
//将資訊輸出到單獨的檔案和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
std::ofstream fs("glog_dump.log",std::ios::app);
std::string str = std::string(data,size);
fs<<str;
fs.close();
LOG(ERROR)<<str;
}
class GLogHelper
{
public:
GLogHelper(char* program)
{
google::InitGoogleLogging(program);
FLAGS_colorlogtostderr=true;
google::InstallFailureSignalHandler();
//預設捕捉 SIGSEGV 信号資訊輸出會輸出到 stderr,可以通過下面的方法自定義輸出方式:
google::InstallFailureWriter(&SignalHandle);
}
~GLogHelper()
{
google::ShutdownGoogleLogging();
}
};
void fun()
{
int* pi = new int;
delete pi;
pi = ;
int j = *pi;
}
int main(int argc,char* argv[])
{
GLogHelper gh(argv[]);
fun();
}
條件宏
-
LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;
上面的語句表示,隻有當num_cookies > 10條件成立時,“Got lots of cookies”日志資訊才被記錄。
-
LOG_EVERY_N(INFO, 10) << “Got the ” << COUNTER << “th cookie”;
上面的語句表示,在程式中周期性的記錄日志資訊,在該語句第1、11、21……次被執行的時候,記錄日志資訊。COUNTER變量表示該語句被執行的次數。
-
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << “Got the ” << COUNTER<<”th big cookie”;
上面的語句為前兩項功能的合并,size>1024的條件連續成立10次的時候記錄日志資訊。COUNTER變量表示該條件成立的次數。
-
LOG_FIRST_N(INFO, 20) << “Got the ” << COUNTER << “th cookie”;
上面的語句表示,當該語句隻在首次執行了20次以後記錄日志資訊, COUNTER變量表示該語句被執行的次數。
條件宏中,如果為假則右邊日志中的函數不會執行
CHECK 宏
當通過該宏指定的條件不成立的時候,程式會中止,并且記錄對應的FATAL日志資訊。功能類似于ASSERT,差別是 CHECK 宏不受 NDEBUG 限制,在 release 版中同樣有效。
-
CHECK(condition)
參數會是匿名參數如CHECK(string(“abc”)[1],’b’)
-
比較驗證:
在輸出中會輸出比較值,是以要求比較值重載了輸出操作符(operator<<(ostream,…))
- CHECK_EQ(arg1,arg2)
- CHECK_NE(arg1,arg2)
- CHECK_LE(arg1,arg2)
- CHECK_LT(arg1,arg2)
- CHECK_GE(arg1,arg2)
- CHECK_GT(arg1,arg2)
-
CHECK_NOTNULL(arg)
不能作為日志輸出流使用
- 字元串比較:
- CHECK_STREQ
- CHECK_STRNE
- CHECK_STRCASEEQ
- CHECK_STRCASENE
- 浮點數驗證:
- CHECK_DOUBLE_EQ
- CHECK_NEAR
TODO
- 定制日志(Verbose Logging)
- debug功能
- ……
參考:
google-glog 開源庫分析
glog
google-glog功能介紹