google glog 使用方法

glog官方地址:https://code.google.com/p/google-glog/

glog作用:日志库

安装方法

./configure

make

make install

Hello world

foo_1.cpp

[cpp] view plain copy

  1. #include <glog/logging.h>
  2. int main(int argc,char* argv[]) {  
  3. // If glog is used to parse the command line 
  4. // google::ParseCommandLineFlags(&argc, &argv, true);
  5. // Initialize Google's logging library.
  6.     google::InitGoogleLogging(argv[0]);  
  7.     FLAGS_log_dir = "./log";  
  8.     LOG(INFO) << "hello world";  
  9. return 0;  
  10. }  

g++ -o foo_1 -lglog foo_1.cpp

运行后会在log目录下生成日志文件。

FLAGS_log_dir设置日志输出目录。google::ParseCommandLineFlags(&argc, &argv, true); 使用时,可解析命令行参数。如 foo_1 --log_dir=log

日志级别

INFO, WARNING, ERROR, FATAL、分别对应数字

0, 1, 2, 3

对应级别的日志打印在对应级别的日志文件中。

并且高级别的日志同时打印在本级别和低级别中。

例如 INFO中会有WARNING级别的输出。

日志文件

默认输出在“/tmp/”目录下,修改输出目录方法:

  • FLAGS_log_dir值修改
  • google::ParseCommandLineFlags(&argc, &argv, true); 使用时,命令行参数log_dir设置。

日志文件名称格式:<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

例如:hello_world.example.com.hamaji.log.INFO.20080709-222411.10474

本文开始处的例子中的 google::InitGoogleLogging(argv[0]); 参数便为设置程序名称。

初始化参数

FLAGS_log_dir       日志输出目录

FLAGS_v                 自定义VLOG(m)时,m值小于此处设置值的语句才有输出

FLAGS_max_log_size     每个日志文件最大大小(MB级别)

FLAGS_minloglevel       输出日志的最小级别,即高于等于该级别的日志都将输出。

更多参数可见 logging.h

并且各个参数均可以通过命令行参数的方式设置。

LOG_XX

满足一定条件下输出日志,例如:

LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

该宏为:

#define LOG_IF(severity, condition) \

  !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)

上一条语句则为num_cookies > 10为真时, LOG(INFO) << "Got lots of cookies";

logging.h 中还定义了很多其他的条件输出,可根据需要查找使用。

DLOG_XX

依赖于编译参数的LOG_XX,当使用-DNDEBUG编译时失效。该宏为:

#ifndef NDEBUG

#define DLOG(severity) LOG(severity)

还有很多其他的DLOG_XX, 参见头文件。

CHECK_XX

check检查失败时直接退出程序。类似assert()。

和assert的区别是不依赖于编译时的NDEBUG选项, 目的是尽快发现隐藏的问题。例如:

CHECK( fd != NULL ) << " fd is NULL, can not be used ! ";

#define CHECK(condition)  \

      LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \

             << "Check failed: " #condition " "

还有很多CHECK_XX的宏,可参见头文件。

VLOG_XX

可以独立于默认的日志级别,用户自己定义自己的日志级别。

个人感觉不常用。

信号处理

个人感觉很有用,会输出导致程序结束的信号。SIGKILL 这个信号因为不可捕获所以不在这个信号处理之列。

只需使用google::InstallFailureSignalHandler(); 注册一下即可。

默认是打印到stderr中。

可以使用InstallFailureWriter()定义输出方式。该宏为:

GOOGLE_GLOG_DLL_DECL void InstallFailureWriter(

    void (*writer)(const char* data, int size));

}

RAW_XX  线程安全方式

<glog/raw_logging.h>中的各个RAW_XX为线程安全的使用方式。

官方特意说明“which does not allocate any memory or acquire any locks”。

结束

// Shutdown google's logging library.

GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging();

结语

以上为 glog 一些简单总结,更细致的内容见相关文档及头文件。

有错误请指正,转发劳驾帖个地址。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术墨客

Spring核心——数据校验

在Java数据校验详解中详细介绍了Java数据校验相关的功能(简称Bean Validation,涵盖JSR-303、JSR-349、JSR-380),本文将在...

1211
来自专栏高性能服务器开发

(五)如何编写高性能日志

一、服务器端日志与客户端日志的区别 在正式讲解之前,我们先来看一个日志类的实现方法,这个日志类也是代表着大多数客户端日志的主流写法: /** *@desc:...

4308
来自专栏日常分享

Java 端口扫描器 TCP的实现方法

想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSoc...

2061
来自专栏JMCui

Netty 系列九(支持UDP协议).

1、无连接协议,没有持久化连接; 2、每个 UDP 数据报都是一个单独的传输单元; 3、一定的数据报丢失; 4、没有重传机制,也不管数据报是否可达; 5、速度比...

4334
来自专栏码匠的流水账

聊聊spring for kafka对consumer的封装与集成

本文主要解析一下spring for kafka对原生的kafka client consumer的封装与集成。

1861
来自专栏Flutter&Dart

DartVM服务器开发(第五天)--日志工具

上面代码的level就是下面onRecord监听能覆盖的范围,我们传入ALL,就是全部的日志输出都监听,LogRecord是一个日志记录类,里面包换的日志的相关...

1852
来自专栏同步博客

PHP中遍历XML之SimpleXML

  简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。XML是当今用于传输数据的两大工具之一,另外一个是json。

921
来自专栏猿天地

Netty 断线重连解决方案

本篇文章是Netty专题的第七篇,前面六篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty-整合k...

7958
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第26章 RL-TCPnet之DHCP应用

本章节为大家讲解RL-TCPnet的DHCP应用,学习本章节前,务必要优先学习第25章的DHCP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效果。

1041
来自专栏Ceph对象存储方案

源码阅读再来一发:解读RGW中request的处理流程

请求处理流程图 ? 以civetweb为例 1. rgw_main.cc为整个radosgw服务的入口,main()函数中根据在ceph.conf的rgw...

7439

扫码关注云+社区

领取腾讯云代金券