日志能方便地诊断程序原因、统计程序运行数据,是大型软件系统必不可少的组件之一。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[0]);// ...int num_cookies = 100;LOG(INFO) << "Found " << num_cookies << " cookies";return 0;
}

  结果出现错误:

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!";

  运行程序生成了三种日志文件:

// INFOLog 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[0]);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 0;
}

  在Project目录下(如果直接运行程序则在程序所在路径下)创建log文件夹,运行程序生成的日志会输出到该文件夹中:

  注意,打印FATAL消息会在打印完成后终止程序:

  glog提供了一些调试模式时输出,release模式下不输出的宏,如DLOG,DLOG_IF,DLOG_EVERY_N等。这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度。

  // 如果工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.DLOG(INFO) << "DLOG:Debug Mode Message!";

  

  如果要自定义输出log文件的格式,可修改源代码logging.cc文件中相关的函数。

参考:

glog简介

glog 入门教程

glog使用教程

Glog使用文档

glog使用与功能修改

Google-glog 日志库使用手记

在Windows上编译、应用glog

Installing GLog on Windows

How To Use Google Logging Library (glog)

google/glog: C++ implementation of the Google logging module

转载于:https://www.cnblogs.com/21207-iHome/p/9297329.html

glog日志库使用笔记相关推荐

  1. C++ Windows下Glog日志库安装使用教程

    2018年是我写过一个关于Glog使用的教程(https://blog.csdn.net/qq_27278957/article/details/84648912),但是最近再使用时,发现和当时使用方 ...

  2. log4j linux如果日志目录不存在,Java日志库学习笔记

    (未完成,待修改) 一.安装Log4j log4j的库文件可以在官方网站下载: 二.log4j.properties的目录搜索规则 在src/目录下创建一个log4j.properties文件,即LC ...

  3. golang 日志库seelog 笔记

    之前做服务的时候一直在用seelog作为日志输出的库,用了一段时间发现还是挺好用的,最近有时间就来总结一下. 我这边用到的seelog一般都是将程序中的一些信息输入到日志文件中,方便调试和维护程序.日 ...

  4. Linux C++ glog日志库的简单使用

    参考博文:C++ 命令行解析包 gflags 使用详解 例: 代码 #include <glog/logging.h> #include <iostream> #include ...

  5. 2017年4月25日(日志库glog)

    原博客:http://www.cnblogs.com/kuliuheng/p/5046101.html 使用文档说明:http://www.yeolar.com/note/2014/12/20/glo ...

  6. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试

    按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...

  7. glog --- C++日志库

    glog -- C++日志库 日志库glog glog安装 简单使用 默认输出 仅输出到标准输出 输出设置 输出目录设置 错误类型 条件输出 日志库glog 实现应用程序级日志记录的C++库. 项目地 ...

  8. 日志库glog之如何用cmake将源码生成.sln文件

    glog是google提供的一个开源的C++日志库.由于最新的glog源码工程中,已经移除了".sln"文件,代之以"a CMake build system" ...

  9. C++第三方日志库Glog的安装与使用超详解

    目录 一.glog介绍 二.glog下载 三.环境介绍 三.glog的编译详解 3.1 利用CMake进行编译,生成VS解决方案 3.2 利用VS对项目进行编译 四.glog的基本使用 4.1 创建V ...

最新文章

  1. 雅虎向阿里巴巴示好原因有二
  2. python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题
  3. 入门:现实世界中的推荐系统(术语、技术等)
  4. 数据结构-图-邻接矩阵-试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc-icoding
  5. python2和python3的默认编码_python2和python3哪个版本新
  6. 给DNS划重点:分析ISC BIND必知必会
  7. 数据为桥迈向智能,渤海财险数据架构智能化演进
  8. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)
  9. oracle drop purge
  10. 二分法06:第一个错误的版本
  11. 批量修改文件夹及文件用户权限和用户组权限 centos
  12. 值得收藏!中国金融体系主要指标大全
  13. 怎么利用计算机自带功能删除垃圾,如何清理电脑垃圾,教您如何彻底清除系统垃圾...
  14. 计算机常用单词 pdf,关于计算机的常用词汇.pdf
  15. 诺禾-数据库操作优化
  16. linux进程家族树,Linux内核 | 进程管理
  17. 【驻油点】一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升。显然卡车一次是过不了沙漠的。因此司机必须设法在沿途建立几个贮油点,使卡车能顺利穿越沙漠,试问司机如何建
  18. nginx光速入门到进阶
  19. 智慧园区地图导航解决方案,如何实现园区内地图导航?
  20. 如何用Python代码发一个炫酷的朋友圈

热门文章

  1. Eigen入门之密集矩阵 8 - resharp slicing切片
  2. AngularJS 日期格式化
  3. windows下buildbot 的搭建及config文件讲解
  4. Linux下使用g++编译C++程序——Compiling Cpp
  5. bart使用方法_使用简单变压器的BART释义
  6. 因为银行过度授信导致信用卡逾期还不上,可以拒绝还款吗?
  7. 旅美华人票友演绎易卜生话剧《玩偶之家》
  8. 如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)
  9. mysql中如何删除多个表格_mysql怎么批量删除多个表?
  10. react usecontext_鬼才!我居然把 Vue3 的原理用到了 React 上?