安装
git clone https://github.com/google/glog.git
cd /glog
cmake -gui:设置glog路径和输出路径,configure,然后generate.
打开VS,打开glog.sln,选择debug或者release输出
使用
项目test.sln.
- 将glog.sln项目中的logging.h拷贝到test.sln目录,将最初的glog文件夹下的src\windows\glog拷贝到test.sln工程目录,工程中添加.拷贝glog.sln项目下的glog.lib和glogd.lib.(这里使用静态库,如果要使用动态库可以configure CMake中选择动态库进行编译)
- 添加宏定义:
_WINDOWS;GLOG_NO_ABBREVIATED_SEVERITIES;GOOGLE_GLOG_DLL_DECL=;
- 示例:
#include "logging.h"
using namespace google;
#ifdef _DEBUG
#pragma comment(lib, "glogd.lib")
#else
#pragma comment(lib, "glog.lib")
#endif
int main(int argc, char* argv[])
{
// Start google log system:
FLAGS_log_dir = "d:\\Logs";
google::InitGoogleLogging(argv[0]); //argv[0] 程序名(用过gcc的应该都知道)
google::SetLogDestination(google::GLOG_INFO, "d:\\Logs\\INFO_");
google::SetStderrLogging(google::GLOG_INFO);
google::SetLogFilenameExtension("log_");
//google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
FLAGS_colorlogtostderr = true; // Set log color
FLAGS_logbufsecs = 0; // Set log output speed(s)
FLAGS_max_log_size = 1024; // Set max log file size
FLAGS_stop_logging_if_full_disk = true; // If disk is full
char str[20] = "hello log!";
LOG(INFO) << str;
LOG(INFO) << "info test" << "hello log!"; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
google::ShutdownGoogleLogging();
return 0;
}
输出
以上示例得到3个文件,对应三种日志级别的日志.
tips
- 条件输出:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie"; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; //当此语句执行的前 20 次都输出日志,然后不再输出
- 只在调试模式打日志:
DLOG(INFO) << "Found cookies";
- CHECK宏
CHECK 宏和标准库中的 assert 宏类似,可以在给定的条件不满足时终止程序;
有各种用于相等/不等检查的宏: CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT 。它们比较两个值,在不满足期望时打印包括这两个值的 FATAL 日志。注意这里的值需要定义了 operator<<(ostream, …)
判断指针为空的宏:CHECK_NOTNULL(some_ptr);some_ptr->DoSomething();
该宏会返回传入的指针,因此在构造函数的初始化列表中非常有用;
struct S {
S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) {}
Something* ptr_;
};
- 通过修改
logging.cc
中的LogFileObject::CreateLogfile,LogFileObject::Write
更改输出log文件的格式和命名
参考Glog使用文档