glog

一. 下载与安装

git clone https://github.com/google/glog.git
cd glog
./autogen.sh
./configure
make
make check
make install

二.glog简单的使用说明

1. log的严重等级

等级描述 对应的等级数字
INFO 0
WARNING 1
ERROR 2
FATAL 3
  • 每一个等级都有一个对应的log输出文件,默认文件名为(包含文件路径) 为:/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>
  • 对于高严重的等级,不仅会把相应的log信息输出到对应到等级文件中,还会输出到比它更的log文件中, 例如对于ERROR等级的log,不仅会输出到ERROR的文件中,还会输出到INFO和WARNING的文件中。
  • 对于ERROR和FATAL等级,不仅仅会把相关的log信息输出到对应的文件中,还会把log信息输出到standard error中, 默认就是屏幕上。
  • 在release模式下,当产生了FATAL等级的log信息时,程序会被终止掉,在debug模式下,会自动把FATAL等级降至到ERROR等级, 也就是不会终止程序。

使用方法:

// 输出INFO等级的log信息。
LOG(INFO) << "This is INFO severity log information. ";
// 输出WARNING等级的log信息。
LOG(WARNING) << "This is WARNING severity log information. ";
// 输出ERROR等级的log信息。
LOG(ERROR) << "This is ERROR severity log information. ";
// 输出FATAL等级的log信息。
LOG(FATAL) << "This is FATAL severity log information. ";

2. 使用gflags在命令行中设置一些flag位.

在安装glog时,如果你的电脑中已经安装了gfalgs库的话, 在编译时,它会自动使用gflags库,然后呢,当你使用glog库时,就可以使用gflags库的命令行特性了。(需要在main函数的开始处加上对gflags的初始化代码gflags::ParseCommandLineFlags(&argc, &argv, true)). 常使用到flags包含(更详细看一下logging.cc文件):

  • logtostderr(bool类型): 把日志信息输出到stderr中,而不是文件中。 (在命令行中使用--logtostderr=true 或 --logtostderr=false)
  • stderrthreshold(int类型): 把严重等级>=指定等级的log信息额外输出到stderr中(默认为2,即ERROR和FATAL)
  • minloglevel (int 类型): 只有当严重等级>=指定等级时,会进行log的输出。

3. Conditional/Occasional Logging

  • LOG_IF(等级描述, 条件) << "日志信息"; 当条件满足时,才会打印日志。
  • LOG_EVERY_N(等级描述, n) << "日志信息"; 每n次会打印一条日志。
  • LOG_IF_EVERY_N(等级描述, 条件, n) << "日志信息."; 当条件成立时,每n次打印一条日志。
  • LOG_FIRST_N(等级描述, n) << "日志信息。"; 当打印前n次的日志信息。

4. debug 模式的支持

下面定义的宏只会在debug模式下起作用,在release模式下无效,这样可以避免在release版本下打印日志影响运行速度。

  • DLOG(等级描述) << "日志信息。";
  • DLOG_IF(等级描述, 条件) << "日志信息";
  • DLOG_EVERY_N(等级描述, n) << "日志信息";

5. CHECK 宏的使用

CHECK宏提供了一种机制:当条件不满足时,程序直接终止掉, 类似于ASSERT宏。

宏的名字 作用
CHECK_EQ(a,b) 检测a与b是否相等
CHECK_NE(a,b) 检测a与b是否不相等
CHECK_LE(a,b) 检测a是否小于或等于b
CHECK_LT(a,b) 检测a是否小于b
CHECK_GE(a,b) 检测a是否大于或等于b
CHECK_GT(a,b) 检测a是否大于b
CHECK_NOTNULL(指针) 检测指针不为空,它的返回值是传给它的指针. 该宏不能像c++的输出流那样使用

使用方法:

CHECK_EQ(a,b) << " 当a与b不相等时,程序会中止运行,并打印出该条目志信息。";

特别注意:当指针与NULL进行比较时,编译器会报错,因为把NULL认为是0。 如果不想报错,需要把NULL强转换为指针类型(static_cast<指针类型>(NULL).

6. 用户自己定义Failure Function

当产生FATAL的日志信息或CHECK宏检测失败时,程序就会终止掉,默认情况下glog会dump出堆栈的相关信息并以错误码1退出程序的运行,我们可以注册自定义的函数来运行你想要的函数。

// 第一步:定义自己的Failure函数
void MyFailureFunction()
{
/*
添加自己的代码。
*/
exit(1);
} // 第二步,在main函数的开始部分,加入一行如下代码:
int main(int argc, char* argv[])
{
/*
其它初始化代码。
*/
google::InstallFailureFunction(&MyFailureFunction);
}

7. Failure Signal Handler

可以自定义一些信号捕捉函数,然后通过google::InstallFailureSignalHandler()函数来注册一下。具体没有深入研究。

三. 运行小小的demo

1. 创建文件glog_demo.cpp文件,内容如下:

#include <glog/logging.h>

int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
google::InitGoogleLogging(argv[0]);
LOG(INFO) << "This is INFO log information";
LOG(WARNING) << "This is WARNING log information";
LOG(ERROR) << "This is ERROR log information";
//LOG(FATAL) << "This is FATAL log information"; LOG_IF(INFO, 1 < 2) << "This is true: 1 < 2. ";
for (int i = 0; i < 100; ++i)
{
LOG_EVERY_N(INFO, 10) << "Log every 10 times. ";
} CHECK(1 < 2) << "The world is end, because one is not less than 2. ";
return 0;
}

2. 编译并运行

g++ glog_demo.cpp -o a.out -pthread -lgflags -lglog
./a.out glog_demo.cpp --logtostderr=true

glog入门demo的更多相关文章

  1. 【SSH系列】初识spring+入门demo

    学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...

  2. GLOG使用Demo

    GLOG使用Demo GLOG是Google开源的一个精简的日志系统,博主简单学习了一下并记录常见用法,以备日常查询 一.安装 照例是编译安装,不过没有使用cmake git clone https: ...

  3. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  4. apollo入门demo实战(二)

    1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...

  5. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

  6. netty入门demo(一)

    目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...

  7. canal入门Demo

    关于canal具体的原理,以及应用场景,可以参考开发文档:https://github.com/alibaba/canal 下面给出canal的入门Demo (一)部署canal服务器 可以参考官方文 ...

  8. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  9. SpringBoot 入门 Demo

    SpringBoot   入门 Demo Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...

随机推荐

  1. RedisDeskTopManager连接时提示:can't nonnect to redis-server

    场景 在使用RedisDeskTopManager客户端可视化工具连接Redis服务端时提示: 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众 ...

  2. 【Android】WebDav For Android

    最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用. 服务器提供商是使用国内的坚果云,还是非常良心的. 坚果云官网:https://w ...

  3. 【56】目标检测之NMS非极大值抑制

    非极大值抑制(Non-max suppression) 到目前为止你们学到的对象检测中的一个问题是,你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次.非极大值抑制 ...

  4. 在Oracle中使用sqlload做数据迁移

    前提:检查sqlload是否可用,输入sqlldr,提示有版本即可   1.创建测试表(已有则跳过)create table testTable(user varchar2(255),name var ...

  5. .Net Core通过json文件 配置管理后台导航菜单

    先来看个最终效果图 以前我们配置后台菜单 一般都是把菜单链接, 图标, 以及层级关系 配置到数据库,Core很容易通过json文件来配置导航菜单  而不用存数据库了 先添加个menuconfig.js ...

  6. DOM基础+domReady+元素节点类型判断

    DOM节点类型  nodeType element  1    Node.ELEMENT_NODE   元素节点 attr  2   Node.ATTRIBUTE_NODE  属性节点 text  3 ...

  7. 将String类型的json数据转换为真正的json数据

    问题 在做JavaWeb项目的时候,我们经常需要将Java对象转化为Json数据格式响应到前台页面,但是转化完成之后,看着是Json类型的数据格式,但实际上是字符串类型,在这里说两个方法将String ...

  8. 纪中23日c组T2 2159. 【2017.7.11普及】max 洛谷P1249 最大乘积

    纪中2159. max 洛谷P1249 最大乘积 说明:这两题基本完全相同,故放在一起写题解 纪中2159. max (File IO): input:max.in output:max.out 时间 ...

  9. Selenium实战(四)——unittest单元测试框架1

    Python中的单元测试框架包含:doctest.unittest.pyttest.nose等,使用unittest单元测试框架不需要自行定义断言失败的提示,并且当一个测试函数执行失败后,后面的测试函 ...

  10. swiper滑动失效问题

    最近在写移动端的项目,页面有用的是swiper滑动的. 但是会发现在滑动时,不灵活,就是滑动时隐藏的数据会显示,但是不滑动数据又在初始那,隐藏的数据还是看不到. 于是各种排除问题,终于在pc端+移动端 ...