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...
日志文件命名:如果可执行文件名为 “test”,则将日志输出到文件后,还会生成 test.ERROR,test.WARNING,test.INFO 三个链接文件,分别链接到对应级别的日志文件。
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
[6] 更详细的glog说明