欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

glog的使用

程序员文章站 2022-03-20 13:29:14
...

google 出的一个C++轻量级日志库,支持以下功能:

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

1.安装glog

$git clone https://github.com/google/glog
$./autogen.sh && ./configure && make && make install
gflags 库会默认安装在 /usr/local/lib/ 下,头文件放在 /usr/local/include/gflags/

2.包含头文件

#include <glog/logging.h>

3.使用glog

#include <iostream>
#include <glog/logging.h>

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);
    FLAGS_log_dir = "/tmp/logs/"; 
    LOG(INFO) << "hello world";
    return 0;
}

编译:g++ glogtest.cpp -o glogtest -lglog

4.glog相关设置

glog默认是输出到stderr,可以通过初始化参数或设置输出日志目录,修改输出到指定文件
初始化参数默认是输出到/tmp目录下,格式为 “...log...

5.core dump输出文件

比如有空指针引用等报错,默认只会输出segment fault。
通过 google::InstallFailureSignalHandler()即可注册,将 core dumped 信息输出到 stderr。
google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式,SIGSEGV:segment fault报错。

#include <iostream>
#include <string>
#include <glog/logging.h>
using namespace std;
void test() {
    int *p; 
    *p = 5;
}
void SignalHandle(const char* data, int size) {
    string str = data;
    LOG(ERROR) << str << endl;
}

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);
    google::InstallFailureSignalHandler();
    google::InstallFailureWriter(&SignalHandle);    //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出>方式:)
    FLAGS_log_dir = "/tmp/test/"; 
    test();
    LOG(INFO) << "hello world";
    return 0;
}

输出信息:
E0610 11:23:27.816742  4042 ltest.cpp:12] *** Aborted at 1560137007 (unix time) try "date -d @1560137007" if you are using GNU date ***

E0610 11:23:27.817553  4042 ltest.cpp:12] PC: @           0x401018 test()

E0610 11:23:27.817675  4042 ltest.cpp:12] *** SIGSEGV (@0x400eb0) received by PID 4042 (TID 0x7fe0983ae720) from PID 4198064; stack trace: ***

E0610 11:23:27.817975  4042 ltest.cpp:12]     @       0x3d4b632660 (unknown)

E0610 11:23:27.818025  4042 ltest.cpp:12]     @           0x401018 test()
n)

E0610 11:23:27.818066  4042 ltest.cpp:12]     @           0x40114b main
)
n)

E0610 11:23:27.818205  4042 ltest.cpp:12]     @       0x3d4b61ed1d __libc_start_main

E0610 11:23:27.818249  4042 ltest.cpp:12]     @           0x400ed9 (unknown)
rt_main

Segmentation fault

6.自定义日志

VLOG(1)

7.references

[1] http://rpg.ifi.uzh.ch/docs/glog.html
[2] https://blog.csdn.net/yuliying/article/details/19010075
[3] https://www.cnblogs.com/foreveryl/archive/2011/10/14/2212265.html
[4] http://www.yeolar.com/note/2014/12/20/glog/
[5] https://blog.51cto.com/mengjh/546766