0、简介

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

sudo apt-get install libgoogle-glog*

参考博客:
https://blog.csdn.net/jcjc918/article/details/51682853
https://www.cnblogs.com/hiloves/p/6009707.html

1、基础用法

头文件:

#include <glog/logging.h>

四个打印级别:

LOG(INFO)    << "<INFO> Hello World!";
LOG(WARNING) << "<WARNING> Hello World!";
LOG(ERROR)  << "<ERROR>Hello World!";
LOG(FATAL)  << "<FATAL>Hello World!";
2、自定义日志,需要配合命令行参数 -v 和 -vmodule
VLOG(100) << "VLOG INFO 100";
3、glog 和 gflags 配合管理日志,命令行参数说明如下
1> 除了使用命令行参数外,可以在程序中使用 FLAGS_ 宏来指定如:
FLAGS_logbufsecs = 0;  //日志实时输出
FLAGS_max_log_size=10; //最大日志文件大小 10M
2> 如果没有安装gflags,可以在环境变量中使用“GLOG_”前缀的宏代替
GLOG_logtostderr=1
3> 命令行参数列表

Flags from src/logging.cc:
-alsologtoemail (log messages go to these email addresses in addition to logfiles) type: string default: “”
除了日志文件外,日志消息还将传到这些电子邮件地址(测试无效???需要-logemaillevel,并安装mail(sudo apt-get install mailutils),并配置mail)
-alsologtostderr (log messages go to stderr in addition to logfiles) type: bool default: false
除日志文件外,日志消息还将被发送到stderr
-colorlogtostderr (color messages logged to stderr (if supported by terminal)) type: bool default: false
记录到stderr的彩色消息(如果终端支持)INFO白色、WARNING黄色、ERROR红色、FATAL红色
-drop_log_memory (Drop in-memory buffers of log contents. Logs can grow very quickly and they are rarely read before they need to be evicted from memory. Instead, drop them from memory as soon as they are flushed to disk.) type: bool default: true
删除日志内容的内存缓冲区。日志可以增长得非常快,并且在需要从内存中删除日志之前很少被读取。相反,一旦将它们刷新到磁盘,就将它们从内存中删除。
-log_backtrace_at (Emit a backtrace when logging at file:linenum.) type: string default: “”
在file:linenum上进行日志记录时发出回溯跟踪(不知道啥作用,跟gdb有关)
-log_dir (If specified, logfiles are written into this directory instead of the default logging directory.) type: string default: “”
如果指定,日志文件将写入该目录,默认目录"/tmp/...log...." (e.g., “/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474”)
-log_link (Put additional links to the log files in this directory) type: string default: “”
将其他链接放到这个目录中的日志文件中
-log_prefix (Prepend the log prefix to the start of each log line) type: bool default: true
将日志前缀前置到每个日志行开头
{默认是true格式如下
//I0627 11:44:02.730262 6022 logV1.cpp:7] Hello World!
//W0627 11:44:02.731287 6022 logV1.cpp:8] Hello World!
//E0627 11:44:02.731693 6022 logV1.cpp:9] Hello World!
//F0627 11:44:02.731901 6022 logV1.cpp:10] Hello World!
设置为false:-log_prefix=false
Hello World!
Hello World!
Hello World!
Hello World!
}
// -logbuflevel (Buffer log messages logged at this level or lower (-1 means don’t buffer; 0 means buffer INFO only; …)) type: int32 default: 0
缓冲区日志记录在此级别或更低级别的消息(-1表示不缓冲区;0只表示缓冲区INFO;…)
-logbufsecs (Buffer log messages for at most this many seconds) type: int32 default: 30
缓冲区日志消息最多持续这么多秒
-logemaillevel (Email log messages logged at this level or higher (0 means email all; 3 means email FATAL only; …)) type: int32 default: 999
在此级别或更高级别记录的电子邮件日志消息(0表示全部;3只表示FATAL;…)
-logmailer (Mailer used to send logging email) type: string default: “/bin/mail”
Mailer用于发送日志邮件
-logtostderr (log messages go to stderr instead of logfiles) type: bool default: false
日志消息将转到stderr而不是日志文件
-max_log_size (approx. maximum log file size (in MB). A value of 0 will be silently overridden to 1.) type: int32 default: 1800
设置最大日志文件大小(以MB为单位)。值0将被悄悄地重写为1
// -minloglevel (Messages logged at a lower level than this don’t actually get logged anywhere) type: int32 default: 0
设置最低记录级别
-stderrthreshold (log messages at or above this level are copied to stderr in addition to logfiles. This flag obsoletes --alsologtostderr.) type: int32 default: 2
除日志文件外,还将此级别或更高级别的日志消息复制到stderr。这个标志将被淘汰——alsologtostderr。
-stop_logging_if_full_disk (Stop attempting to log to disk if the disk is full.) type: bool default: false
如果磁盘已满,请停止尝试登录到磁盘

Flags from src/utilities.cc:
-symbolize_stacktrace (Symbolize the stack trace in the tombstone) type: bool default: true
表示墓碑上的堆栈轨迹(未知???)

Flags from src/vlog_is_on.cc:
-v (Show all VLOG(m) messages for m <= this. Overridable by --vmodule.) type: int32 default: 0
使用VLOG(m)时,显示小于m的信息
-vmodule (per-module verbose level. Argument is a comma-separated list of =. is a glob pattern, matched against the filename base (that is, name ignoring .cc/.h./-inl.h). overrides any value given by --v.) type: string default: “”
详细级别。参数是一个以逗号分隔的列表,其中包含=。是一个glob模式,与文件名基础匹配(即忽略.cc/.h /-inl.h)。覆盖——v给出的任何值。

4、常用函数和宏

1> google::InitGoogleLogging(argv[0]);
2> google::ShutdownGoogleLogging(); 关闭
3> LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”; //当条件满足时输出日志
4> LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
5> LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << “th big cookie”; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
6> LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << “th cookie”; //当此语句执行的前 20 次都输出日志,然后不再输出
7> google::SetLogDestination(google::GLOG_INFO, “log/prefix_”); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
8> google::SetLogFilenameExtension(“logExtension”); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
9> google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出

10> 调试宏,只有在调试模式下有效
DLOG(INFO) << “Found cookies”;
DLOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;
DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”;

11> void InstallFailureSignalHandler(); //安装处理程序,当程序收到SIGSEGV、SIGILL、SIGFPE、SIGABRT、SIGBUS、SIGTERM信号而崩溃时,
默认情况下,信号处理程序将把故障(信号信息和堆栈)转储写入标准错误。可以通过InstallFailureWriter()安装自己的writer函数来定制目标。
如果希望对所有线程使用故障信号处理程序,则应该在创建线程之前调用该函数。堆栈跟踪将只显示接收信号的线程。换句话说,不会显示其他线程的堆栈跟踪。

5、检查宏CHECK*

1>条件检测

CHECK(condition) //测试条件condition是否正确

源码分析

 #define CHECK(condition)  LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) << "Check failed: " #condition " "
当检测的条件不成立是,执行 FATAL ( 致命的)级别的打印,并退出
#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2) // 检测 val1 是否等于     val2
#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2) // 检测 val1 是否不等于   val2
#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2) // 检测 val1 是否小于等于 val2
#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2) // 检测 val1 是否小于     val2
#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2) // 检测 val1 是否大于等于 val2
#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2) // 检测 val1 是否大于     val2CHECK_NOTNULL(val)    //检测val是否不为空NULL

2> 字符串char*检测

#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2)  //检测字符串 s1 和 s2 相同
#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同
#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2) //检测字符串 s1 和 s2 相同,忽略大小写
#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同,忽略大小写

3> 浮点数比较

#define CHECK_DOUBLE_EQ(val1, val2)      // 检测浮点数 val1 和 val2 相等
#define CHECK_NEAR(val1, val2, margin)  // 检测浮点数 val1 和 val2 相等,前后相差margin以内认为是相等的

源码分析

#define CHECK_DOUBLE_EQ(val1, val2)              \do {                                           \CHECK_LE((val1), (val2)+0.000000000000001L); \CHECK_GE((val1), (val2)-0.000000000000001L); \} while (0)#define CHECK_NEAR(val1, val2, margin)           \do {                                           \CHECK_LE((val1), (val2)+(margin));           \CHECK_GE((val1), (val2)-(margin));           \} while (0)
6、glog 的功能全列出来:

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

【C++】google glog详解相关推荐

  1. 分布式表格系统Google Bigtable详解

    分布式表格系统Google Bigtable详解 概述 Bigtable架构 数据分布 保证 副本位置与负载均衡 存储 表的分裂与合并 存储引擎 垃圾回收 总结 概述 bigtable系统由表格组成, ...

  2. 【NLP】Google BERT详解

    版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...

  3. Google官方 详解 Android 性能优化【史诗巨著之内存篇】

    尊重博主原创,如需转载,请附上本文链接http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用 ...

  4. 【C++】google gtest 详解

    1.参考博客: https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/arch ...

  5. 【C++】google gflags详解

    参考博客:https://blog.csdn.net/lezardfu/article/details/23753741 0.简介 gflags是google的一个开源的处理命令行参数的库,使用c++ ...

  6. Google工程师详解Android架构

    Google的一位工程师Sans Serif发布了一篇博文非常清楚的描述了Android系统架构,中国移动通信研究院院长黄晓庆在新浪微博上推荐了该文,并认为文中对Android的介绍很好,您可以看一下 ...

  7. Google AutoValue详解

    背景 首先说Android Model,在开发中网络请求,以及数据库操作等,我们都会定义一个Model,不同人对这个的说法不一样,比如有Entry,Bean,Pojo. 通常对于实体类,我们需要做如下 ...

  8. Google官方详解 Activity【项目实例不容错过!】

    开始我们的Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码. 有一系列 ...

  9. BERT原理和结构详解

    目录 1. 模型输入 2. 网络结构 2.1 Self-Attention Layer 2.2 Layer Normalization 2.3 BERT 每一层的学习 3. 模型预训练 3.1 训练任 ...

最新文章

  1. PAT甲级排队问题合集 (持续更新中)
  2. Android图片缓存之Lru算法
  3. vs中使用def导出函数
  4. Google调查了人们过去24小时的观看记录,发现了这些......
  5. 带有批注的Spring硒测试
  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(8) - 数据类型转换指令
  7. Java虚拟机专题之内存分配(读书笔记)
  8. python输入n×n的矩阵_Python使用shape计算矩阵的行和列
  9. Robocode:下载安装及迁移至IntelliJ
  10. 计算机键盘能直接接手机吗,手机变电脑!智能手机外接键盘和鼠标的3种方法...
  11. 人机交互-13-复习总览
  12. char int word long的大小
  13. RNN结构,双向LSTM,Transformer, BERT对比分析
  14. ORACLE EBS中附件功能的使用
  15. JS EventListener
  16. 乡镇村委干部职工数字化办公管理小程序系统开发制作介绍
  17. 今年计划读完的几本书
  18. Linux dos2unix命令
  19. 腰痛,别以为都是“劳损”
  20. 【一起入门MachineLearning】中科院机器学习期末考试*总复习*-考前押题+考后题目回忆

热门文章

  1. 学习《Linux设备模型浅析之设备篇》笔记(深挖二)
  2. java8u211_jre864位u211
  3. 快速精确的体素GICP三维点云配准算法
  4. Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
  5. 修改Nginx默认80端口指向目录
  6. 如何判断CPU、内存、磁盘的性能瓶颈?
  7. Java - 框架之 SpringBoot 攻略day01
  8. 深入理解Java线程池:ThreadPoolExecutor
  9. Servlet的基本架构
  10. Tiny4412 Uboot