C++的开源跨平台日志库glog学习研究(一)
作为C++领域中为数不多的好用、高效的、跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了。glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作。
恰巧趁着五一我也学习研究了这个glog库,写个总结如下。走过路过的的各位牛人、高手可以忽略这篇文章了。
从code.google.com下载源码(在这里),在Visual Studio 2010中打开工程,如下:

可见只有四个工程,其中libglog和libglog_static分别是Windows下的动态库和静态库,其实代码都是一样的,另外两个工程分别是测试工程(也是同一套代码),看名字都就知道了。
glog实现代码并不多,代码量统计如下:

从上面看出真正有效的C/C++代码也就8000行以内吧。
直接编译,注意,竟然不能编译通过!!!我这里下载的是SVN 地址http://google-glog.googlecode.com/svn/trunk/上的r142版本,从编译错误可以找到原因,简单修改即可全部编译成功,就是将文件logging.cc中的第183、189、199、205行的ssize_t改为size_t,如下:

实在不明白为什么还有这种情况发生,难道不应该至少保证编译没问题才会commit代码的么。而直接下载的稳定版(glog-0.3.3.tar.gz )则没有这个问题,看来开发版本都是不可靠的啊。
把所有代码从每个文件的代码量和实现复杂度做一个整体分析。
按代码行数排序:

按复杂度排序(复杂度定义在不同工具中有不同表示,这里仅作参考):

从这里也基本能看出重要的文件或函数实现了。另外按复杂度排序是排名第一的文件叫做demangle.cc,你在VS工程里并没有发现有这个cc,甚至都没有include相应的demangle.h,这个文件是干嘛的?随后再作分析(其实单看文件名就基本能猜到了)。
其中logging.cc是主要的功能实现,对该文件的分析如下:

logging.cc中函数复杂度如下:

当然,不同人使用不同的分析工具,导致上面的结果会有一定的差异,仍以logging.cc为例,使用另外工具分析函数复杂度部分结果如下:

注意函数LogFileObject::Write和TruncateLogFile的复杂度排序计算值和排序顺序都不相同,但总体上来说都算是正常的,也算是都能管中窥豹吧。
有了这些简单的统计分析,接下来浏览代码就相对有方向性了,不过话说这个代码量总体来说也不多。像该代码中使用了大量的宏技巧,初看还是不好理解的,接下来会从代码上做点分析理解。
一直没有介绍glog,但是,如果你了解glog,那你肯定知道些什么了。最后把glog的特性或者说功能简单摘抄如下(处处都有,不显示引用原作了):
- 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
- 严重性分级,根据日志严重性分级记录日志;
- 可有条件地记录日志信息;
- 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
- 异常信号处理。程序异常情况,可自定义异常处理过程;
- 支持debug功能。可只用于debug模式;
- 自定义日志信息;
- 线程安全日志记录方式;
- 系统级日志记录;
- google perror风格日志信息;
- 精简日志字符串信息。
好吧这里还是给出我引用的文章:
http://google-glog.googlecode.com/svn/trunk/doc/glog.html#verbose
http://mengjh.blog.51cto.com/2860827/546766
C++的开源跨平台日志库glog学习研究(一)的更多相关文章
- C++的开源跨平台日志库glog学习研究(三)--杂项
在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- 谷歌日志库GLog 使用说明
1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...
- Centos7 下谷歌日志库GLog配置
1 glog下载地址 https://code.google.com/archive/p/google-glog/downloads glog-0.3.3.tar.gz 需要FQ,直接打不开 2 解压 ...
- GO的日志库log竟然这么简单!
前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...
- 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
随机推荐
- 分享一个以前写的基于C#语言操作数据库的小框架
一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...
- Win窗口坐标二维坐标与OpenGl的世界坐标系的之间的相互转换
Win窗口坐标二维坐标与OpenGl的世界坐标系的转换 几何处理管线擅长于使用视图和投影矩阵以及用于裁剪的视口把顶点的世界坐标变换为窗口坐标. 但是,在有些情况下,需要逆转这个过程.一种常见的情形是: ...
- 通过hbase实现日志的转存(MR AnalyserLogDataRunner和AnalyserLogDataMapper)
操作代码(提前启动集群(start-all.sh).zookeeper(zkServer.sh start).启动历史任务服务器(mr-jobhistory-daemon.sh start histo ...
- Tmux与Oh-my-zsh环境整合
在Mac客户端配置好oh-my-zsh后,安装了tmux应用,但是每次进入tmux都会提示以下警告信息,虽然并没有实际上的影响,但是还是感觉每次弹出窗口后会很闹心,所以采用如下配置进行解决. 报错 ...
- 通过Spring Session实现新一代的Session管理
长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...
- 使用ABP框架踩过的坑系列2
ABP中有很多惯例,如果使用得当,可以事半功倍,如果使用不当,也会有很大的麻烦,是否适当其实还是要看Need需求 ASP.NET Boilerplate (ABP) is an open source ...
- MSSQL 全库搜索 指定字符串
平时在在MSSql中查询数据的时候,想查找,某个字段在数据库中是否存在,并且查询出在哪个表中,哪个字段下面,在不知道的情况下,操作起来会很麻烦,然后就写了一个sql语句,使用起来感觉挺方便的.当然了, ...
- .NET 简易方法拦截器
伟大的无产阶级Willaim曾说过:"无论你觉得自己多么的了不起,也永远有人比你更强".对,我说过!我就是william. 今天想记录一下在项目中遇到的一个比较有意思的东西,异常拦 ...
- 盘古分词+一元/二元分词Lucene
本文参考自:https://blog.csdn.net/mss359681091/article/details/52078147 http://www.cnblogs.com/top5/archiv ...
- win10开机 依赖服务或组无法启动
win10开机后 音频服务 网络服务等都没有开启,下面是开启步骤 Win+R打开的[运行]窗口输入“msconfig”后回车或者点击[确定] 在打开的[系统配置]窗口选择[服务]选项卡 在[服务]选项 ...