载后解压,利用Visual Studio打开google-glog.sln。生成解决方案
打开sln会有几个项目,libglog是动态库,生成dll,libglog_static是静态库,生成lib。
安装:
方法一:将libglog.dll和libglog.lib文件,拷贝文件到你的工程文件夹下,并拷贝srcwindows下的glog目录到你的工程文件下。
方法二:你也可以将这两个文件拷贝到系统文件夹下,实现全局访问。
1. 将libglog.dll拷贝到C:Program FilesMicrosoft Visual Studio 11.0VCin
2. 将libglog.lib拷贝到C:Program FilesMicrosoft Visual Studio 11.0VClib
3. 将srcwindows下的glog目录拷贝到C:Program FilesMicrosoft Visual Studio 11.0VCinclude
#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> 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字符集还是不行。
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. 头文件在srcwindowsglog
文件包含和宏定义:#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
标志参数 | 类型 | 作用 |
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]