glog使用与功能修改

作者: NickYang 分类: 技术文章,程序开发 发布时间: 2014-02-19 13:49

在写代码的过程中,打log肯定是少不了的,毕竟不能总靠调试来发现问题。log库的选用就很纠结了,成熟的log库非常多,log4cpp、log4cxx、poco.log、boost.log、glog等等,以前我用过log4cxx,觉得配置巨麻烦,一大段看着好纠结,不过用起来很舒服。这次我决定使用比较轻量的glog。

glog来自于google,google提供给大家不少好东西,所以功能和质量上都是可以保证的。而且很轻量,用起来很灵活。

glog项目地址:https://code.google.com/p/google-glog/

glog的文档:英文 http://google-glog.googlecode.com/svn/trunk/doc/glog.html

glog入门代码就不多写了,在文档中也有,网上也是一大片,大家请自行搜索。他提供了vs工程和configure文件,编译方法见文档。

 

我修改的部分

1.增加文件按天区分

glog是根据进程ID来区分文件的,如果你重新启动了程序,则log文件的名字就会变,这样似乎不太满足我的需求,我还要求它可以每天生成文件,方便我整理和分析log,其实也有办法,自己增加一个按天滚文件的函数就可以了。

在utilities.cc中增加函数如下,(因为PidHasChanged()在这个文件里)

在logging.cc的LogFileObject::Write函数中将

改成

这样就会按照天来输出log了。

 

2.glog默认有四种log级别,高级别的log中会包含低级别的log,这个我也是不需要的,我希望每一个分级一个文件。

我增加了一个宏来控制这个开关,以免影响到原来的功能。

在glog/src/windows/glog/logging.h (我在windows上用的,linux的请自己查找)

然后修改 logging.cc中的LogDestination::LogToAllLogfiles为如下

我整体的初始化函数如下:

这些改动之后我的功能基本就满足了,修改下log输出的格式,原来的log格式大致是这样的 I1234 02/11 12:20:50.123456 xxx.cpp 12] 你的log内容,是 级别的首字母 线程ID 月/日 时分秒微秒 文件名 行号],我将它修改成为  [级别名 线程ID 年/月/日 时分秒毫秒 文件名 行号],在logging.cc的LogMessage::Init函数中修改

再加上一个log(severity_level, format, …)函数就可以打印log了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

20条评论
  • xuejun_deng

    2015 年 10 月 20 日 14:05

    再加上一个log(severity_level, format, …)函数就可以打印log了。 不知道实现没有

    潜水 Chrome浏览器 Windows XP
    1. eliteYang

      2015 年 10 月 24 日 11:28

      必须实现了啊,已经用在项目里了

      站长 Chrome浏览器 Windows 7 x64 Edition
  • jj

    2015 年 8 月 5 日 10:08

    这个glog感觉不成熟啊,似乎只支持windows平台。
    其他日志库 log4系列,不是因为使用unicode崩溃,就是使用LGPL,GPL授权。
    有没有功能强大,简单易用,授权宽松的日志库推荐啊?

    潜水 Chrome浏览器 Windows 8.1 x64 Edition
    1. eliteYang

      2015 年 8 月 5 日 15:16

      glog非常成熟,是跨平台的,google开源的项目,现在我在使用easyloggingpp,你可以去试试,个人感觉很不错的

      站长 Chrome浏览器 Windows 7 x64 Edition
  • Roger

    2014 年 6 月 12 日 11:13

    日志轮转的代码有bug

    潜水 Chrome浏览器 Windows 8.1 x64 Edition
    1. eliteYang

      2014 年 6 月 12 日 11:54

      有什么bug,请说一下

      神话 Chrome浏览器 Windows 7 x64 Edition
      1. Roger

        2014 年 6 月 13 日 23:01

        某次轮转之后,g_main_day 被更新,其他级别的LogFileObject就不会触发轮转了。bug的表现就是只会有某个级别的日志发生轮转

        潜水 Chrome浏览器 Windows 8.1 x64 Edition
        1. eliteYang

          2014 年 6 月 14 日 14:09

          打点输出日志看下吧,这个值只有DayHasChanged会用到,而且是静态的,应该是没问题的,我这边用了半年,倒是没发现这个问题。如果你调试出来这个问题,麻烦留言说一下,谢谢

          神话 Chrome浏览器 Windows 7 x64 Edition
          1. zzm

            2015 年 7 月 28 日 13:06

            该反馈是对的,现象是只有一个级别(INFO)的日志会检测到DayHasChanged()。 g_main_day得改成数组g_main_day[NUM_SEVERITIES],调用DayHasChanged()时传入参数DayHasChanged(severity_)

            潜水 Chrome浏览器 Windows 7
            1. eliteYang

              2015 年 7 月 28 日 13:38

              改成数组倒也是可以,不过glog我现在已经不再用了,可以试试easylogging++,headonly,比较舒服

              站长 Chrome浏览器 Windows 7 x64 Edition
            2. 力哥

              2016 年 9 月 5 日 14:26

              请问改成数据具体怎么改,可否贴出代码

              潜水 Chrome浏览器 Windows 7 x64 Edition
  • tangfu

    2014 年 6 月 4 日 11:38

    高级别日志打印到低级别日志中,一般来说确实有点蛋疼。不过这样也有好处,必然能够在一个日志文件中快速的看到日志的相关上下文

    潜水 Chrome浏览器 Windows 7
    1. eliteYang

      2014 年 6 月 5 日 10:05

      恩,有利有弊吧,我个人是喜欢分开打印,这样查错误时比较单纯

      神话 Chrome浏览器 Windows 7 x64 Edition
  • Yu

    2014 年 2 月 19 日 23:07

    赞。正想分享居然找不到按钮…

    神话 Chrome浏览器 GNU/Linux x64
    1. eliteYang

      2014 年 2 月 20 日 00:02

      哈哈……我嫌加载慢去掉了,稍等我开启啊

      神话 Chrome浏览器 Windows 7 x64 Edition
    2. eliteYang

      2014 年 2 月 20 日 01:36

      自己增加了分享代码,这下你可以用了

      神话 Chrome浏览器 Windows 7 x64 Edition
      1. Yu

        2014 年 2 月 20 日 20:54

        专门为我开启个啊–不胜荣幸

        神话 Chrome浏览器 GNU/Linux x64
        1. eliteYang

          2014 年 2 月 21 日 09:46

          哈哈……用户为主

          神话 Chrome浏览器 Windows 7 x64 Edition
  • 巴尔少侠

    2014 年 2 月 19 日 14:06

    回头细看,先赞一个 😆

    ps:都没有“给力”和”V5″的表情

    潜水 Chrome浏览器 Windows 7 x64 Edition
    1. eliteYang

      2014 年 2 月 19 日 15:25

      回头把表情表换掉,换成微博的那种

      神话 Chrome浏览器 Windows 7 x64 Edition

发表评论

电子邮件地址不会被公开。 必填项已用*标注