glog 是 google 的一个 c++ 开源日志系统,轻巧灵活,入门简单,而且功能也比较完善。
安装

以下是官方的安装方法,一句命令:

➜  code git clone https://github.com/google/glog.git
➜  code cd glog
➜  glog git:(master) ✗ ./configure && make && make install

然而我出现了 N 个错误,以下是两个编译的错误:
错误记录:

Issue1: 出现 aclocal-1.14: command not found 和 recipe for target 'aclocal.m4' failed 的错误提示。
解决方法:

➜  glog git:(master) ✗ sudo apt-get install automake
➜  glog git:(master) ✗ sudo autoreconf -ivf

Issue2:之后出现另一个错误:error: expected initializer before 'Demangle'。
解决方法:

➜  code cd glog
➜  glog git:(master) ✗ mkdir build && cd build
➜  build git:(master) ✗ export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
➜  build git:(master) ✗ make
➜  build git:(master) ✗ sudo make install

使用
菜鸟级

从一个最简单的程序开始:

#include <glog/logging.h>

int main(int argc,char* argv[])
{
    google::InitGoogleLogging(argv[0]); //初始化 glog
    LOG(INFO) << "Hello,GOOGLE!";
}

编译:

➜  glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test #编译
➜  glog ./glog_test

➜  glog ll /tmp  # 默认日志在 /tmp 下
total 28K
-rw-rw-r-- 1 angryrookie angryrookie  193  7月  3 22:04 glog_test.cheng.angryrookie.log.INFO.20160703-220405.6569
lrwxrwxrwx 1 angryrookie angryrookie   57  7月  3 22:04 glog_test.INFO -> glog_test.cheng.angryrookie.log.INFO.20160703-220405.6569
➜  glog cat /tmp/glog_test.INFO
Log file created at: 2016/07/03 22:04:05
Running on machine: cheng
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0703 22:04:05.242153  6569 glog_test2.cpp:7] Hello,GLOG!

这里 g++ 编译的时候注意链接的库是要按顺序的(我也是才知道)。gcc 和 g++ 中库的链接顺序是从右往左进行,所以要把最基础实现的库放在最后,这样左边的 lib 就可以调用右边的 lib 中的代码。

一开始没注意顺序出现各种找不到函数,用 nm -C 定位了好久。而且这里我必须再链接上 gflags 才能成功编译,看网上其他人都没有。如果有大神知道为什么麻烦带带我。

这里没有指定日志文件的目录,默认会放在 /tmp 下,文件名的格式为 <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>。我们再看一下代码打印出的日志信息:

I0703 22:04:05.242153  6569 glog_test2.cpp:7] Hello,GLOG!

这一行信息对应的分别是:I+日期 时:分:秒.微秒 线程号 源文件名:行数] 信息,这些信息对定位问题,做统计都很有效,可以根据具体项目来做分析。
新手级

日志文件的位置可以通过 gflags 命令行参数 log_dir 来指定,这时注意在 main 函数开始时初始化 gflags: google::ParseCommandLineFlags(&argc, &argv, true);,也可以直接在代码里 指定 FLAGS_log_dir 的值。这里还是推荐标准的做法,即用命令行参数。

glog 的日志会根据日志严重性分级记录日志,标准的分级为:INFO, WARNING, ERROR, FATAL。不同级别的日志信息会输出到不同文件,同时高级别的日志也会写入到低级别中。

再看个例子:

#include <glog/logging.h>

int main(int argc,char* argv[])
{
    google::InitGoogleLogging(argv[0]);  // 初始化 glog
    google::ParseCommandLineFlags(&argc, &argv, true);  // 初始化 gflags
    LOG(INFO) << "Hello, GOOGLE!";  // INFO 级别的日志
    LOG(ERROR) << "ERROR, GOOGLE!";  // ERROR 级别的日志
    return 0;
}

再次编译运行:

➜  glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test
➜  glog mkdir log # 建一个目录放日志文件
➜  glog ./glog_test -log_dir=./log                               
E0703 22:59:13.380125  6867 glog_test2.cpp:8] ERROR, GOOGLE!  # 这里 ERROR 级别的日志还作为 stderr 输出了到控制台

➜  glog ll log
total 16K
-rw-rw-r-- 1 angryrookie angryrookie 196  7月  3 22:59 glog_test.cheng.angryrookie.log.ERROR.20160703-225913.6867
-rw-rw-r-- 1 angryrookie angryrookie 257  7月  3 22:59 glog_test.cheng.angryrookie.log.INFO.20160703-225913.6867
-rw-rw-r-- 1 angryrookie angryrookie 196  7月  3 22:59 glog_test.cheng.angryrookie.log.WARNING.20160703-225913.6867
lrwxrwxrwx 1 angryrookie angryrookie  58  7月  3 22:59 glog_test.ERROR -> glog_test.cheng.angryrookie.log.ERROR.20160703-225913.6867
lrwxrwxrwx 1 angryrookie angryrookie  57  7月  3 22:59 glog_test.INFO -> glog_test.cheng.angryrookie.log.INFO.20160703-225913.6867
lrwxrwxrwx 1 angryrookie angryrookie  60  7月  3 22:59 glog_test.WARNING -> glog_test.cheng.angryrookie.log.WARNING.20160703-225913.6867

这里可以看到,我们通过 log_dir 指定了日志存放目录。而这里虽然我们没有输出 WARNING 级别的日志信息,但却有该级别的日志。看一下分别是什么:

➜  glog cd log        
➜  log cat glog_test.ERROR
Log file created at: 2016/07/03 22:59:13
Running on machine: cheng
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0703 22:59:13.380125  6867 glog_test2.cpp:8] ERROR, GOOGLE!

➜  log cat glog_test.WARNING
Log file created at: 2016/07/03 22:59:13
Running on machine: cheng
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0703 22:59:13.380125  6867 glog_test2.cpp:8] ERROR, GOOGLE!

➜  log cat glog_test.INFO   
Log file created at: 2016/07/03 22:59:13
Running on machine: cheng
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0703 22:59:13.379570  6867 glog_test2.cpp:7] Hello, GOOGLE!
E0703 22:59:13.380125  6867 glog_test2.cpp:8] ERROR, GOOGLE!

WARNING 级别的日志里放了 ERROR 的输出信息,这就是我们说的高级别的日志会写入到低级别中,而且是每个低级别。

还有一个常用的日志输出语句,即自定义日志类型 VLOG。VLOG 的用法也很简单,像这样 VLOG(50) << "MY VLOG INFO";。这里的 50 只是自己定义的一个级别,事实上你可以定义任何一个数字,但一般越小的数字代表这条输出日志越重要。通过命令行参数 -v 50 这样子来指定 VLOG 输出的级别,-v 50 意味着只有小于 50 以下的 VLOG 才会被输出(这里不会影响 LOG(INFO)这些)。一般项目里越底层的库使用越大数字的 VLOG 来打印调试信息,这样可以使得日志不会被一堆底层库的运行信息淹没。

再看个例子:

#include <glog/logging.h>

int main(int argc,char* argv[])
{
    google::InitGoogleLogging(argv[0]);
    google::ParseCommandLineFlags(&argc, &argv, true);
    LOG(INFO) << "Hello, GOOGLE!";
    VLOG(100) << "VLOG INFO 100";
    VLOG(50) << "VLOG INFO 50";
    VLOG(10) << "VLOG INFO 10";
    return 0;
}

这里我们有三条 VLOG 信息,分别是 100 50 10 三个级别。VLOG 的信息只会出现在 INFO 级别的日志中:

➜  glog g++ glog_test3.cpp -lglog -lgflags -lpthread -o glog_test
➜  glog ./glog_test -log_dir=./log -v 50

➜  glog cat log/glog_test.INFO
Log file created at: 2016/07/03 23:24:32
Running on machine: cheng
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0703 23:24:32.225793  7046 glog_test3.cpp:7] Hello, GOOGLE!
I0703 23:24:32.226384  7046 glog_test3.cpp:9] VLOG INFO 50
I0703 23:24:32.226410  7046 glog_test3.cpp:10] VLOG INFO 10

我们可以看到,指定了 -v 50 后,只有小于等于 50 的 VLOG 及正常 LOG(INFO) 信息被打印出来。如果你问如果不指定会怎样,回答就是一条 VLOG 信息都不会出现。
进阶版

如果你以为这里还有进阶版介绍的话,我只能向你表示抱歉。我的使用只是简单级别,目前项目也没有必要更复杂的 glog 接口。

当然,我们也可以像其他博客把 glog 的功能全列出来:

参数设置,以命令行参数的方式设置标志参数来控制日志记录行为
    严重性分级,根据日志严重性分级记录日志
    可有条件地记录日志信息
    条件中止程序。丰富的条件判定宏,可预设程序终止条件
    异常信号处理。程序异常情况,可自定义异常处理过程
    支持debug功能。可只用于debug模式
    自定义日志信息
    线程安全日志记录方式
    系统级日志记录
    google perror风格日志信息
    精简日志字符串信息

这是文档传送门:文档

google glog 简单使用小结相关推荐

  1. Google Glog使用

    Glog是Google的一个C++开源日志系统,轻巧灵活,入门简单,而且功能也比较完善. 安装 以下是官方的安装方法 git clone https://github.com/google/glog. ...

  2. 在windows下基于visual studio2017和CMake的安装Google glog

    这里简单记录安装google glog在windows下基于visual studio2017的安装过程. 下载 https://github.com/google/glog 使用cmake编译,编译 ...

  3. google glog使用指南

    Google Logging (glog) 是一个 C++98 库,用于实现应用程序级日志记录.该库提供了基于 C++ 风格流和各种帮助宏的日志 API. 入门 您可以通过简单地将内容流式传输到LOG ...

  4. Google/glog

    glog简介: google 出的一个C++轻量级日志库,支持以下功能: ◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为: ◆ 严重性分级,根据日志严重性分级记录日志: ◆ 可有条件地 ...

  5. Google glog 使用

    Google glog 使用 1        简介 Googleglog 库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏. 代码示例: #include <glog/logg ...

  6. 【C++】google glog详解

    0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...

  7. Google glog

    本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬误,欢迎大家指出!英文原文见 http://google-glog.googlecode.com/svn/ ...

  8. caffe中LOG(INFO) DLOG(INFO)介绍(统称Google glog)

    Original url: http://blog.51cto.com/mengjh/546766    本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬 ...

  9. Google I/O 2019 小结

    Google I/O 2019 大会于北京时间 5 月 8 日凌晨 1 点,在美国山景城 Shoreline Amphitheatre (圆形剧场) 举办.今天熬夜看了直播,这里对大会的 keynot ...

  10. google glog简介

    本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬误,欢迎大家指出!英文原文见 http://google-glog.googlecode.com/svn/ ...

最新文章

  1. c#中如何跨线程调用windows窗体控件?
  2. 【Harvest源码分析】GetFilteredSignal函数
  3. python ctypes模块安装_ctypes模块扩展python
  4. 本机在合成图片经常提示内存不足
  5. matlab 安装glpk,mac上安装GLPK
  6. java取网页源码_Java获取任意http网页源代码的方法
  7. 创建Maven web工程不能解析EL表达式的解决办法
  8. 使用C#读写ini配置文件
  9. python 正则表达式语法
  10. 关于数据库“事务”“索引”“实例”的含义
  11. Atitit 提升记忆的稳定性防止遗忘 目录 1. 存储稳定性(记忆牢固性),需要多处存储,提升稳定性 1 2. 方法分类原则 2 2.1. 常复习 2 2.2. 复习方法多样化 利用多种感官 2
  12. Java给树加子节点个数统计
  13. 软路由做网站服务器怎么样,为啥我不用双软路由(三)低成本和高体验
  14. 2020软科中国计算机学科排名,【智库数据】基于2020软科中国最好学科排名的学科动态发展跟踪...
  15. Echarts引入省级地图(简便快捷,以浙江省为例)
  16. uoj #213.【UNR #1】争夺圣杯 单调栈
  17. Nginx编译安装及配置文件详解
  18. Dell服务器出错代码和含义
  19. 高知的程序员必须甩脱穷人思维
  20. Centos7升级到最新内核版本操作过程

热门文章

  1. IDEA-快捷键noob
  2. CentOs下安装pip3
  3. signature=45f2913b66c5b2ae668a6622be005d65,国开大《商务英语4》自测试题及答案
  4. 粗暴解决《python数据挖掘入门与实践》第五章PCA案例中pd.read_csv函数里converters无作为的方案
  5. linux版虚拟示波器,借你一双慧眼——DSCope虚拟示波器评测
  6. 如何创建属于你自己的域名邮箱
  7. 易基因 | 项目文章 | oxBS-seq揭示了宫颈癌发生过程中的表观遗传特征变化
  8. 数学专项counting:LA 5846
  9. 尚硅谷周阳老师 - Docker课程学习
  10. “二十一天好习惯”第一期-20