glog安裝與使用


 

window環境下glog的安裝

載后解壓,利用Visual Studio打開google-glog.sln。生成解決方案

打開sln會有幾個項目,libglog是動態庫,生成dll,libglog_static是靜態庫,生成lib。

安裝:

方法一:將libglog.dll和libglog.lib文件,拷貝文件到你的工程文件夾下,並拷貝src\windows\下的glog目錄到你的工程文件下。

方法二:你也可以將這兩個文件拷貝到系統文件夾下,實現全局訪問。

1. 將libglog.dll拷貝到C:\Program Files\Microsoft Visual Studio 11.0\VC\bin

2. 將libglog.lib拷貝到C:\Program Files\Microsoft Visual Studio 11.0\VC\lib

3. 將src\windows\下的glog目錄拷貝到C:\Program Files\Microsoft Visual Studio 11.0\VC\include

#include "glog/logging.h"    
#include <iostream>    
#include <vector>    
using namespace std;    
#pragma comment(lib,"libglog.lib")    
  
int main(int argc, char* argv[])  
{  
    // Initialize Google's logging library.    
    google::InitGoogleLogging(argv[0]);    
    google::SetLogDestination(google::INFO,"E://");    
    // 設置日志路徑  INFO WARNING ERROR FATAL    
    // ...    
    char str[20] = "hello log!";    
    LOG(INFO) << "Found " << google::COUNTER <<endl;    
    LOG(INFO) << str ;//<< " cookies";    
    LOG(WARNING) << "warning test";  // 會輸出一個Warning日志    
    LOG(ERROR) << "error test";//會輸出一個Error日志    
  
    system("pause");  
    return 0;  
}  
說明:
1:生成解決方案 
     不是調試,而是生成 =》生成解決方案(或者快捷鍵F7)
2:會新生成一個目錄Debug,所有的libglog.dll和libglog.lib就位於Debug目錄下
3:推薦使用第二種方式
 
 
我編譯出現錯誤:

1> glogTest.cpp
1> 正在生成代碼...
1>glogTest.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPBD@Z),該符號在函數 _main 中被引用
1>glogTest.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QAE@PBDH@Z),該符號在函數 _main 中被引用
1>glogTest.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall google::LogMessage::LogMessage(char const *,

庫目錄和lib目錄以及libglog_static.lib都配置了,按照道理來說不可能出現無法解析的外部符號。 

我看一篇文章說的是字符集的問題:

error LNK2019: 無法解析的外部符號 "__declspec(dllimport)

我在VS2005下寫C++的程序,采用一個工程生成DLL文件給另一個工程執行,但每次執行時都出現 error LNK2019: 無法解析的外部符號 "__declspec(dllimport)錯誤。檢查了好幾遍代碼都覺得沒有問題。

最后發現是字符集出現問題。生成DLL文件的字符集是Unicode而生成exe文件的字符集為默認的ASCII。

只要統一字符集即可解決問題:

VS2005的c++項目默認字符集是使用 Unicode 字符集,在項目屬性->配置屬性-->常規->項目默認值->字符集中設置字符集即可。

補充VC6.0是默認采用ASCII字符集的。

 

我把glog改成了unicode字符集還是不行。

 
 
glog如何采用靜態鏈接的方式呢?答案是要看官方doc文檔的說法:在自定義工程中添加“GOOGLE_GLOG_DLL_DECL=” 和 “GLOG_NO_ABBREVIATED_SEVERITIES” 這兩個宏,第二個宏主要是為了避免與windows.h沖突(下面會講到),第一個宏才是使用靜態鏈接庫時必須的!在編譯時可以編譯兩個版本:Release 和 Debug 以供調試時使用。
 
 
環境:
XPsp3 vs2005  glog-0.3.3  http://download.csdn.net/detail/chenguangxing3/6661667
 
編譯:
glog-0.3.3里面有vs2008的sln,vs2005可以直接修改sln和vcproj降版本.
打開sln直接編譯就行了,沒懸念.編譯后生成: libglog.dll libglog.lib libglog_static.lib. 頭文件在src\windows\glog
 
使用:
文件包含和宏定義:
#define GOOGLE_GLOG_DLL_DECL           // 使用靜態glog庫用這個
#define GLOG_NO_ABBREVIATED_SEVERITIES // 沒這個編譯會出錯,傳說因為和Windows.h沖突
#include "glog/logging.h"
#pragma comment(lib,"glog/libglog_static.lib")
 
設置參數,輸出日志:
FLAGS_log_dir = "c:\\GLogFiles";     // 設置日志文件保存目錄,這個目錄必須是已經存在的,否則不能生成日志文件.
 
// GLog生成的文件名格式是[文件名].[計算機名].[Windows用戶名].[log].[等級].[年月日時分秒].[PID]例如:abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-112354.3108
// 每個進程中至少要執行1次InitGoogleLogging(),否則不產生日志文件.例如:只在xxApp::InitInstance()中調用一次InitGoogleLogging(),xxDlg中不必調用也會把日志輸出到指定文件.
google::InitGoogleLogging( "abc.exe" ); // 設置日志文件名中的"文件名"字段.
 
LOG(INFO) <<  "我在InitInstance()" ;    // 記錄一個INFO等級的日志"我在InitInstance()"
 
google::ShutdownGoogleLogging();      // 停止GLog,與InitGoogleLogging()成對使用.沒有這句vs2005會有內存泄漏,但是網上好多例子都沒有用這句
/*
上面代碼生成了名為"abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-134009.4068"的日志,內容是:
Log file created at: 2013/12/05 13:40:09
Running on machine: J2RT9QDBPIXKGEO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I1205 13:40:09.375000  2460 abc.cpp:75] 我在InitInstance()
*/
 
問題:
GLog好像不支持Unicode
-----------
glog介紹
 本文是根據自己的理解翻譯組織了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").

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等)。

 
表1標志說明
還有其他的標志參數定義在logging.cc,可在文件中搜索“DEFINE_”來進行查看。
1.2     嚴重性分級記錄信息
glog可通過根據指定的嚴重性等級,來選擇性記錄日志。日志信息嚴重性等級按由低到高排列依次為: INFO, WARNINGERROR, 和  FATAL四級。使用者可以在命令行中設置嚴重性等級門限值來控制日志的輸出,詳細見“參數設置”部分的“ 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……次被執行的時候,記錄日志信息。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";

上面的語句表示,當該語句只在首次執行了20次以后記錄日志信息, COUNTER變量表示該語句被執行的次數。

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,判定大小關系

CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用這些宏需要注意類型一致,如果出現類型不一致的,可使用static_cast轉換。

2,判定指針是否為空

         CHECK_NOTNULL(some_ptr),可用於對象初始化的時候。

3,判定字符串是否相等

         CHECK_STREQCHECK_STRNECHECK_STRCASEEQCHECK_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定義。
 
更多:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM