arm-linux系統下加入glog日誌
一、glog介紹
glog 是 Google 開發的一種輕量級C++日誌庫,使用方法十分簡潔、用在程式中也十分的輕巧。
主要支援以下功能:
1 引數設定,通過設定標誌引數來控制日誌記錄行為;
2 嚴重性分級,根據日誌嚴重性分級記錄日誌;
3 可有條件地記錄日誌資訊;
4 條件中止程式,豐富的條件判定巨集,可預設程式終止條件;
5 異常訊號處理。程式異常情況,可自定義異常處理過程;
6 支援debug功能,可只用於debug模式;
7 自定義日誌資訊;
8 執行緒安全日誌記錄方式;
9系統級日誌記錄;
10 google perror風格日誌資訊;
11 精簡日誌字串資訊。
下面記錄一下在工作的專案中是如何使用glog的。
二、編譯glog
首先下載glog檔案:glog-0.3.3.tar.gz,將其解壓 tar -zxvf glog-0.3.3.tar.gz。進入其目錄執行如下命令:
$ ./configure --host=arm-arago-linux-gnueabi
這裡的–host=arm-arago-linux-gnueabi指明開發的平臺,如果不是在對應的ARM上執行,直接執行”./configure”即可。
生成makefile,載執行make命令。會在glog當前目錄的.lib下就會有.so的動態庫libglog.so.0 。將其拷貝到目標機的/usr/lib目錄下。
注意:編譯庫和執行庫是不一樣的,執行庫是在/usr/lib,當編譯運用到glog的程式時還需要在編譯庫裡面加入libglog.so.0。在這裡的編譯庫的路徑是:/ti-sdk-am335x/linux-devkit/arm-arago-linux-gnueabi/usr/lib。否則在編譯的時候要連結此庫但是無法找到這個庫時是不能通過編譯的。
在makefile中需要加入對glog的連結關鍵字:-lglog.
@$$GG -fstack-check -fbounds-check -fstack-protector-all -g -o $(application_name) $(TOPOBJS) -lm -lpthread -lxml2 -lrt -lglog
三、實際運用
上述步驟完成後才能夠在程式中使用。
來看看對glog的一些初始化操作。
void int_glog(void)
{
char defpath[100] = {0};
char str[256] = "mkdir ";
//獲取當前路徑
int cnt = readlink("/proc/self/exe" , defpath, sizeof(defpath));
//delete the exe name
for(int i = cnt; i >= 0; --i)
{
if(defpath[i] == '/')
{
defpath[i+1] = '\0';
break;
}
}
//建立log資料夾
strcat(defpath, "usr/log");
if(access(defpath, FILE_F_OK) != 0)
{
strcat(str,defpath);
system(str);
usleep(100000);
}
//log初始化
google::InitGoogleLogging("New");
FLAGS_colorlogtostderr = true;//設定輸出到螢幕的日誌顯示相應顏色
//FLAGS_servitysinglelog = true;// 用來按照等級區分log檔案
FLAGS_logbufsecs = 0;//緩衝日誌輸出,預設為30秒,此處改為立即輸出
FLAGS_max_log_size = 1; //最大日誌大小為 100MB
FLAGS_stop_logging_if_full_disk = true;//當磁碟被寫滿時,停止日誌輸出
google::SetStderrLogging(google::GLOG_INFO); //設定級別 高於 google::INFO 的日誌同時輸出到螢幕
//日誌名稱和輸出地址
char Info[50] = {0};
char Warn[50] = {0};
char Error[50] = {0};
char Fatal[50] = {0};
strcpy(Info, defpath);
strcpy(Warn, defpath);
strcpy(Error, defpath);
strcpy(Fatal, defpath);
strcat(Info, "/Info_");
strcat(Warn, "/Warning_");
strcat(Error, "/Error_");
strcat(Fatal, "/Fatal_");
google::SetLogDestination(google::GLOG_INFO,Info);
google::SetLogDestination(google::GLOG_WARNING,Warn);
google::SetLogDestination(google::GLOG_ERROR,Error);
google::SetLogDestination(google::GLOG_FATAL,Fatal);
LOG(INFO) <<"------------------------------"<<endl;
LOG(INFO) <<"---------Creat Log!!!---------\n ";
LOG(INFO) <<"------------------------------"<<endl;
}
在初始化程式碼中呼叫了庫函式,需要把glog-0.3.3\src\glog中的標頭檔案加入到程式碼工程檔案中,否則找不到函式定義。
本示例中執行程式後就會在所在執行程式所在資料夾下的usr/log檔案中生成日誌檔案。日誌按照不同的級別進行了分類。