Google glog 使用方法

来源:互联网 发布:微信试探老公 知乎 编辑:程序博客网 时间:2024/05/21 14:48

转自:http://blog.csdn.net/irwin_chen/article/details/8798346


glog官方地址:https://code.google.com/p/google-glog/
glog作用:日志库
安装方法
./configure
make
make install
Hello world
foo_1.cpp
[cpp] view plaincopy
  1. #include <glog/logging.h>  
  2.   
  3. int main(int argc,char* argv[]) {  
  4.     // If glog is used to parse the command line   
  5.     // google::ParseCommandLineFlags(&argc, &argv, true);  
  6.   
  7.     // Initialize Google's logging library.  
  8.     google::InitGoogleLogging(argv[0]);  
  9.   
  10.     FLAGS_log_dir = "./log";  
  11.   
  12.     LOG(INFO) << "hello world";  
  13.   
  14.     return 0;  
  15. }  


g++ -o>
运行后会在log目录下生成日志文件。
  • FLAGS_log_dir设置日志输出目录。
  • google::ParseCommandLineFlags(&argc, &argv,>
日志级别
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();

0 0