2017年4月25日(日志库glog)
原博客:http://www.cnblogs.com/kuliuheng/p/5046101.html
使用文档说明:http://www.yeolar.com/note/2014/12/20/glog/
C++项目开源日志类
1、log4cplushttp://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.0
2、log4cxxhttp://logging.apache.org/log4cxx/download.html
3、glog http://code.google.com/p/google-glog/downloads/list
或者 https://github.com/google/glog
4、log4cpp http://sourceforge.net/projects/log4cpp/files
一、基本用法测试
1、从网上下载google-glog-v0.3.4-50-gde75983.zip,解压到本地,可以看到工程文件google-glog.sln,可以用Visual Studio 2008打开。
2、直接编译就可以得到libglog.dll、libglog.lib等文件,这里的lib文件在编译时要用,而dll文件则是运行时要用的,可以看出这里的glog采用的是“隐式”动态链接库编译方法。
3、将解压出来的文件夹路径:“google-glog\src\windows”添加到Visual Studio 2008 的工程路径中,以便于引用头文件。同时将上一步编译出来的lib文件加入路径或者直接拷贝到自定义工程路径中;
4、使用如下代码可以测试使用:
#include <iostream> using namespace std; #include <glog/logging.h> #pragma comment(lib, "libglog.lib") int main(int argc, char **argv) { google::InitGoogleLogging("KLH"); google::SetLogDestination(google::INFO, "F://"); 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; } |
5、编译生成的exe文件还不能直接运行,需要将第3步编译的dll文件拷贝到相同目录中才能运行。测试的日志文件自动生成在F:/根目录中。类似于如下格式内容:
Log file created at: 2015/12/14 20:28:18 Running on machine: VICTO-PC Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg I1214 20:28:18.590252 9648 main2.cpp:13] Found 0 I1214 20:28:18.591253 9648 main2.cpp:14] hello log! W1214 20:28:18.591253 9648 main2.cpp:15] warning test E1214 20:28:18.592252 9648 main2.cpp:16] error test |
6、其实这里可以看出,用动态链接库编译的方式有个麻烦的地方就是编译出来的exe不能单独运行,必须拷贝dll文件放到一起才行。如何采用静态链接的方式呢?答案是要看官方doc文档的说法:在自定义工程中添加“GOOGLE_GLOG_DLL_DECL=” 和 “GLOG_NO_ABBREVIATED_SEVERITIES” 这两个宏,第二个宏主要是为了避免与windows.h冲突(下面会讲到),第一个宏才是使用静态链接库时必须的!在编译时可以编译两个版本:Release 和 Debug 以供调试时使用。
7、在使用过程中一定要注意编译参数 “/MT” 和 “/MD” 的区别,当然还有 “/MTd” 和 “/MDd” 的不同,可以免去复杂的链接错误、冲定义等问题,在下一篇日志中会专门讲到,如果不清楚这个问题将会是很费劲的,包括之前写过一篇libevent入门的文章说在使用时要忽略一大堆的系统函数库,我觉得也是这个原因导致的。
二、Windows平台应用
glog中原来定义的ERROR宏与windows.h中的ERROR冲突,为了避免冲突,glog作出了改变,增加了GLOG_NO_ABBREVIATED_SEVERITIES宏定义用以区分,那么在代码中用google::GLOG_ERROR来代替原来的google::ERROR
三、自定义glog日志格式
要自定义glog输出格式并不难,可以直接修改logging.cc文件中的LogMessage::Init函数,直接给出修改的位置:
void LogMessage::Init(const char* file, int line, LogSeverity severity, void (LogMessage::*send_method)()) {... ... if (FLAGS_log_prefix && (line != kNoLogPrefix)) { // Change output format. By KuLiuheng. 2015.12.15 stream() << LogSeverityNames[severity][0] << ' ' << setw(4) << 1900+data_->tm_time_.tm_year << '-' << setw(2) << 1+data_->tm_time_.tm_mon << '-' << setw(2) << data_->tm_time_.tm_mday << ' ' << setw(2) << data_->tm_time_.tm_hour << ':' << setw(2) << data_->tm_time_.tm_min << ':' << setw(2) << data_->tm_time_.tm_sec << "." << setw(6) << usecs << ' ' << setfill(' ') << setw(5) << static_cast<unsigned int>(GetTID()) << setfill('0') << ' ' << data_->basename_ << ':' << data_->line_ << "] "; }... ... } |
这样一来输出的格式就是:
Log file created at: 2015/12/15 14:31:05 Running on machine: VICTO-PC Log line format: [IWEF] yyyy-mm-dd hh:mm:ss.uuuuuu threadid file:line] msg I 2015-12-15 14:31:05.341013 2928 main2.cpp:14] Found 0 I 2015-12-15 14:31:05.343014 2928 main2.cpp:15] hello log! W 2015-12-15 14:31:05.343014 2928 main2.cpp:16] warning test E 2015-12-15 14:31:05.344014 2928 main2.cpp:17] error test |
四、使用glog严重错误DUMP功能
使用google::InstallFailureSignalHandler();和 google::InstallFailureWriter(&FatalMessageDump); 可以在程序出现严重错误时将详细的错误信息打印出来,但是使用默认编译的glog将会出现找不到此函数定义的问题,类似于:
error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureWriter(void (__cdecl*)(char const *,int))" (__imp_?InstallFailureWriter@google@@YAXP6AXPBDH@Z@Z),该符号在函数 "public: void __thiscall EnvironmentManager::Initialize(int,char * *,int)" (?Initialize@EnvironmentManager@@QAEXHPAPADH@Z) 中被引用 error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureSignalHandler(void)" (__imp_?InstallFailureSignalHandler@google@@YAXXZ),该符号在函数 "public: void __thiscall EnvironmentManager::Initialize(int,char * *,int)" (?Initialize@EnvironmentManager@@QAEXHPAPADH@Z) 中被引用 |
这个时候只需要在默认的glog工程中,将signalhandler.cc 纳入到libglog工程中,重新编译即可。重新初始化glog的方法如下:
// Start google log system: google::InitGoogleLogging(argv[0]); google::SetLogDestination(google::GLOG_INFO, ".//"); google::SetStderrLogging(google::GLOG_INFO); google::SetLogFilenameExtension("log_"); google::InstallFailureSignalHandler(); google::InstallFailureWriter(&FatalMessageDump); FLAGS_colorlogtostderr = true; // Set log color FLAGS_logbufsecs = 0; // Set log output speed(s) FLAGS_max_log_size = 1024; // Set max log file size(GB) FLAGS_stop_logging_if_full_disk = true; // If disk is full |
五、Linux/Uinux平台应用
下载安装包之后,输入解压命令,直接进入解压后的目录准备编译:
./configue make make install |
直接解压后的configure以及相关.sh文件有可能是没有可执行权限的,用chmod a+x 给一下权限。如果要指定生成的文件路径,那么就在配置的时候输入:./configue--prefix=your_dir
假设glog库的路径为/usr/local/lib/libglog.a,头文件路径为/usr/local/include/glog/logging.h,那么编译命令如下:
g++ test.cpp -o test -L/usr/local/lib -lglog -I/usr/local/include/glog |
glog可以采用命令行的模式配置参数,这也是它灵活易用的体现,有两种指定参数的方法,一种依赖于gflag如下:
./your_application --logtostderr=1 // 或者下面这种: GLOG_logtostderr=1 ./your_application |
所有的环境变量均以GLOG_开头,我们推荐使用第二种,一来不必依赖于gflag,二来当参数很多时,可以写成脚本的形式,看起来更直观,GLOG支持的flag如下(只列出常用的,如果想看全部的,可以在源码的logging.cc文件下看到):
GLOG_logtostderr
bool,默认为FALSE,将日志打印到标准错误,而不是日志文件
GLOG_alsologtostderr
bool,默认为FALSE,将日志打印到日志文件,同时也打印到标准错误
GLOG_stderrthreshold
int,默认为2(ERROR),大于等于这个级别的日志才打印到标准错误,当指定这个参数时,GLOG_alsologtostderr参数将会失效
GLOG_minloglevel
int,默认为0(INFO),小于这个日志级别的将不会打印
GLOG_log_dir
string类型,指定日志输出目录,目录必须存在
GLOG_max_log_size
int,指定日志文件最大size,超过会被切割,单位为MB
GLOG_stop_logging_if_full_disk
bool,默认为FALSE,当磁盘满了之后不再打印日志
GLOG_v
int,默认为0,指定GLOG_v=n时,对vlog(m),当m<=n时才会打印日志
知道了这些参数之后,我们可以在脚本中指定这些变量,还是以test程序为例,test.sh如下:
#!/bin/sh export GLOG_log_dir=log export GLOG_minloglevel=1 export GLOG_stderrthreshold=1 export GLOG_v=3 export GLOG_max_log_size=1 ./test |
转载于:https://blog.51cto.com/geoff/1919326
2017年4月25日(日志库glog)相关推荐
- 2017年9月25日日志
多一些用心,少一些套路,两天的销售培训收获很多,虽然这些内容已经听过无数遍了,但是再一次聆听的时候的仍然还是拿出自己于汪老师所讲进行对比,思考还有哪些没有做到位的. 今天与四楼小白兔牙科的沟通,相关的 ...
- 第四范式陈雨强:万字深析工业界机器学习最新黑科技 By 机器之心2017年7月25日 16:38 近日,全球最顶级大数据会议 Strata Data Conference 在京召开。Strata 大
第四范式陈雨强:万字深析工业界机器学习最新黑科技 By 机器之心2017年7月25日 16:38 近日,全球最顶级大数据会议 Strata Data Conference 在京召开.Strata 大会 ...
- 直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR
直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR 堪 ...
- 2017年9月25日--10月1日(5小时,剩2888小时)
LUA和PHP与我的积累无关,故不记录. 9月25日之前算5小时,剩2888小时
- 4月25日日志(4.25)
分析了工程Data文件夹下,与数据库的映射,从而以后更方便地进行工程迁移. 转载于:https://www.cnblogs.com/song1900/p/8964598.html
- 2017年9月27日日志
今日工作: 上午休息: 1.今日服务安排; 2.四楼小白兔施工内容沟通: 3.单机及打印机排障: 4.文化环境方案制作. 今日分享: 上午休息了半天,一会儿一个电话,本想睡个懒觉,结果虽然休息了半天, ...
- 2017年10月2日日志
今日工作内容: 1.外出服务安排 2.新装一台NAS服务器 3.客户笔记本故障解决 4.组织人员进行四楼机柜改造 今日分享: 成长永远都是自己的事儿,期待着别人给你压力,给你鞭策,给你提醒,仍然是被动 ...
- 【强化记忆】生物选修三填空题考点强化记忆2-胚胎工程、安全伦理问题、生态工程——2017年2月25日...
? 胚胎工程是指对动物早期胚胎或配子所进行的多种显微操作和处理技术,如体外受精.胚胎移植.胚胎分割.胚胎干细胞培养等技术. ? 雄性动物从初情期开始直到生殖机能衰退,在睾丸的曲细精管内源源不断地产生精 ...
- 【强化记忆】生物选修三填空题考点强化记忆1-基因工程、细胞工程——2017年2月25日...
? 基因工程是按照人们的意愿,进行严格的设计,并通过体外DNA重组和转基因等技术,赋予生物以新的遗传特性,从而创造出更符合人们需要的新的生物类型和生物产品. ? 限制酶能够识别双链DNA分子的某种特定 ...
最新文章
- 网站推广——网站推广专员面对新站收录展开多角度思考
- 【CVPR2020论文解读】300米远程深度估计:港科大重磅开源自动驾驶深度感知新技术,远超现有雷达...
- (2) nginx信号量
- 写个随笔解解闷-书签漫游
- Python 科学计算库 Numpy 准备放弃 Python 2 了
- Wpf 简单制作自己的窗体样式
- python自学网站-python自学网站
- andorid使能ftrace失败
- 强烈推荐APP破解常用工具集合!
- 迅捷pdf编辑器是如何编辑pdf文件的
- 微服务守护神-Sentinel-降级规则
- 隔离:正向隔离、反向隔离。
- RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解
- chrome插件(Markdown Nice):用 markdown 写微信公众号
- 给正在排版毕业论文的你:高校毕业论文Latex格式排版模版
- CSS设置背景图像的属性
- PySpark RDD操作
- shp2sdo的下载及使用说明
- win10微软图标点击无反应_Win10系统点击无线图标没反应的解决方法
- 10bit为什么比8bit节省带宽