glog日志库使用笔记
日志能方便地诊断程序原因、统计程序运行数据,是大型软件系统必不可少的组件之一。glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活。
在Github上下载glog,解压后用CMake生成VS2017工程(默认生成的是静态链接库glogd.lib):
在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll,因此要注意应用程序和glog库版本的统一。编译成功后,在build\Debug文件夹下会生成glogd.lib库文件。 src\windows路径下的glog文件夹包含Windows平台所需的头文件:
使用glog时可以在项目“属性→C/C++→常规→附加包含目录”中设置glog头文件路径,也可以直接将windows/glog文件夹复制到VS2017的安装路径中:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include
新建一个简单的x64的Debug工程进行测试,在“项目属性→链接器→输入→附加依赖项”中加入glogd.lib,并在“项目属性→链接器→常规→附加库目录”中输入glogd.lib的路径。进行编译:
#include <glog/logging.h> int main(int argc, char* argv[]) {
// Initialize Google's logging library.
google::InitGoogleLogging(argv[]); // ...
int num_cookies = ;
LOG(INFO) << "Found " << num_cookies << " cookies"; return ;
}
结果出现错误:
1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPEBD@Z),该符号在函数 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QEAA@PEBDH@Z),该符号在函数 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::~LogMessage(void)" (__imp_??1LogMessage@google@@QEAA@XZ),该符号在函数 main 中被引用
1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl google::LogMessage::stream(void)" (__imp_?stream@LogMessage@google@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@XZ),该符号在函数 main 中被引用
1>C:\Users\Thinkpad\Desktop\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe : fatal error LNK1120: 4 个无法解析的外部命令
参考其他文档,在预处理器定义中添加GOOGLE_GLOG_DLL_DECL=宏后解决:
运行程序发现并没有信息输出到控制台中,如果没有设置日志存放的文件夹,它们会被存放到指定的路径(windows平台上会默认存放到$(LOCALAPPDATA)的Temp文件夹下。如C:\Users\Thinkpad\AppData\Local\Temp,路径中的“Thinkpad”是计算机当前的用户名),你可以找到以特定格式命名的文件,格式为:
/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>
生成的log文件如下图所示:
打开文件可以看到如下信息:
Log file created at: 2018/07/14 16:37:30
Running on machine: ROBO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0714 16:37:30.196939 15848 consoleapplication1.cpp:14] Found 100 cookies
上面介绍了日志输出的格式和我们输出的日志信息。glog拥有的4个日志等级:INFO,WARNING,ERROR,FATAL分别对应0,1,2,3。数值越大严重性越高,严重性高的日志不但会保存到自己的日志文件中,还会同时保存到所有比它严重性更低的日志文件中。例如ERROR信息会被同时打印到INFO,WARNING,ERROR日志文件中。添加如下测试代码:
LOG(INFO) << "google log first info level message!";
LOG(WARNING) << "google log first warning level message!";
LOG(ERROR) << "google log first error level message!";
运行程序生成了三种日志文件:
// INFO
Log file created at: 2018/07/14 16:46:28
Running on machine: ROBO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0714 16:46:28.779220 9736 consoleapplication1.cpp:14] google log first info level message!
W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message!
E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message! // WARNING
Log file created at: 2018/07/14 16:46:28
Running on machine: ROBO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message!
E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message! // ERROR
Log file created at: 2018/07/14 16:46:28
Running on machine: ROBO
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message!
同时注意控制台输出了错误信息(默认情况下ERROR和FATAL等级的信息会同时被输出到stderr上):
不同于log4系列的日志系统通过配置文件的方式,glog采用命令的方式来来配置参数,还可以直接在程序中指定。比如下面程序指定了输出log的文件夹:
int main(int argc, char* argv[])
{
string home = "./log/"; //要先创建此目录,否则运行报错. google::InitGoogleLogging(argv[]); string info_log = home + "master_info_";
google::SetLogDestination(google::INFO, info_log.c_str()); string warning_log = home + "master_warning_";
google::SetLogDestination(google::WARNING, warning_log.c_str()); string error_log = home + "master_error_";
google::SetLogDestination(google::ERROR, error_log.c_str()); string fatal_log = home + "master_fatal_";
google::SetLogDestination(google::FATAL, fatal_log.c_str()); // You can specify one of the following severity levels (in increasing order of severity)
LOG(INFO) << "info";
LOG(WARNING) << "warning";
LOG(ERROR) << "error";
LOG(FATAL) << "fatal"; // Logging a FATAL message terminates the program (after the message is logged)! return ;
}
在Project目录下(如果直接运行程序则在程序所在路径下)创建log文件夹,运行程序生成的日志会输出到该文件夹中:
注意,打印FATAL消息会在打印完成后终止程序:
glog提供了一些调试模式时输出,release模式下不输出的宏,如DLOG,DLOG_IF,DLOG_EVERY_N等。这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度。
// 如果工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.
DLOG(INFO) << "DLOG:Debug Mode Message!";
如果要自定义输出log文件的格式,可修改源代码logging.cc文件中相关的函数。
参考:
How To Use Google Logging Library (glog)
google/glog: C++ implementation of the Google logging module
glog日志库使用笔记的更多相关文章
- ubutun16.04 安装编译glog日志库
glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API.在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数(可以参见gflags ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- glog日志库移植Android平台
1.在linux平台下使用ndk交叉编译链编译glog生成libglog.a静态库. 2.将生成的库文件与头文件放到Android项目中,使用JNI方法调用. 3.编译遇到错误“stderr.stdo ...
- C++的开源跨平台日志库glog学习研究(三)--杂项
在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- C++的开源跨平台日志库glog学习研究(一)
作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也 ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- C/C++log日志库比较
事实上,在C的世界里面没有特别好的日志函数库(就像Java里面的的log4j,或者C++的log4cxx).C程序员都喜欢用自己的轮子.printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者 ...
- glog日志
google 开源日志库 #include <glog/logging.h> yum install glog
随机推荐
- day 34 编程之补充内容
生产消费者模型(必须要理解并且牢记,默写内容): from multiprocessing import Process,Queue import time,random,os def procduc ...
- jquery开发插件提供的几种方法
http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html
- Zookeeper三个监听案例
一.监听某一节点内容 /** * @author: PrincessHug * @date: 2019/2/25, 14:28 * @Blog: https://www.cnblogs.com/Hel ...
- Bloxorz I POJ - 3322 (bfs)
Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which m ...
- 详解Spring中的ApplicationListener和ContextRefreshedEvent
ApplicationListener和ContextRefreshedEvent一般都是成对出现的.最近在面试中问到了被面试者对于这两个的用法,面试者大多数被问懵了.可见基础知识的掌握程度.基于此本 ...
- asp.net core 上使用redis探索(3)--redis示例demo
由于是基于.net-core平台,所以,我们最好是基于IDistributedCache接口来实现.ASP.NET-CORE下的官方redis客户端实现是基于StackExchange的.但是官方提供 ...
- 【C#】Convert.ToInt32、(int)和int.Parse三者的区别
前者适合将object类类型转换成int类型 (int)适合简单数据类型之间的转换: int.Parse适合将string类类型转换成int类型.
- ICPC Asia Regional 2015 Japan.Routing a Marathon Race(DFS)
vjudge \(Description\) 给定一张\(n\)个点\(m\)条边的无向图,每个点有一个权值.求一条从\(1\)到\(n\)的路径,使得代价最小,输出最小代价. 一条路径的代价定义为, ...
- BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)
BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...
- HDU.4694.Important Sisters(支配树)
HDU \(Description\) 给定一张简单有向图,起点为\(n\).对每个点求其支配点的编号和. \(n\leq 50000\). \(Solution\) 支配树. 还是有点小懵逼. 不管 ...