glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志。
源码下载:https://github.com/google/glog
ubuntu安装:
sudo apt-get install libgoogle-glog*
参考博客:
https://blog.csdn.net/jcjc918/article/details/51682853
https://www.cnblogs.com/hiloves/p/6009707.html
头文件:
#include <glog/logging.h>
四个打印级别:
LOG(INFO) << "<INFO> Hello World!";
LOG(WARNING) << "<WARNING> Hello World!";
LOG(ERROR) << "<ERROR>Hello World!";
LOG(FATAL) << "<FATAL>Hello World!";
VLOG(100) << "VLOG INFO 100";
FLAGS_logbufsecs = 0; //日志实时输出
FLAGS_max_log_size=10; //最大日志文件大小 10M
GLOG_logtostderr=1
Flags from src/logging.cc:
-alsologtoemail (log messages go to these email addresses in addition to logfiles) type: string default: “”
除了日志文件外,日志消息还将传到这些电子邮件地址(测试无效???需要-logemaillevel,并安装mail(sudo apt-get install mailutils),并配置mail)
-alsologtostderr (log messages go to stderr in addition to logfiles) type: bool default: false
除日志文件外,日志消息还将被发送到stderr
-colorlogtostderr (color messages logged to stderr (if supported by terminal)) type: bool default: false
记录到stderr的彩色消息(如果终端支持)INFO白色、WARNING黄色、ERROR红色、FATAL红色
-drop_log_memory (Drop in-memory buffers of log contents. Logs can grow very quickly and they are rarely read before they need to be evicted from memory. Instead, drop them from memory as soon as they are flushed to disk.) type: bool default: true
删除日志内容的内存缓冲区。日志可以增长得非常快,并且在需要从内存中删除日志之前很少被读取。相反,一旦将它们刷新到磁盘,就将它们从内存中删除。
-log_backtrace_at (Emit a backtrace when logging at file:linenum.) type: string default: “”
在file:linenum上进行日志记录时发出回溯跟踪(不知道啥作用,跟gdb有关)
-log_dir (If specified, logfiles are written into this directory instead of the default logging directory.) type: string default: “”
如果指定,日志文件将写入该目录,默认目录"/tmp/...log...
Flags from src/utilities.cc:
-symbolize_stacktrace (Symbolize the stack trace in the tombstone) type: bool default: true
表示墓碑上的堆栈轨迹(未知???)
Flags from src/vlog_is_on.cc:
-v (Show all VLOG(m) messages for m <= this. Overridable by --vmodule.) type: int32 default: 0
使用VLOG(m)时,显示小于m的信息
-vmodule (per-module verbose level. Argument is a comma-separated list of =. is a glob pattern, matched against the filename base (that is, name ignoring .cc/.h./-inl.h). overrides any value given by --v.) type: string default: “”
详细级别。参数是一个以逗号分隔的列表,其中包含=。是一个glob模式,与文件名基础匹配(即忽略.cc/.h /-inl.h)。覆盖——v给出的任何值。
1> google::InitGoogleLogging(argv[0]);
2> google::ShutdownGoogleLogging(); 关闭
3> LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”; //当条件满足时输出日志
4> LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
5> LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << “th big cookie”; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
6> LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << “th cookie”; //当此语句执行的前 20 次都输出日志,然后不再输出
7> google::SetLogDestination(google::GLOG_INFO, “log/prefix_”); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
8> google::SetLogFilenameExtension(“logExtension”); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
9> google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出
10> 调试宏,只有在调试模式下有效
DLOG(INFO) << “Found cookies”;
DLOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;
DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”;
11> void InstallFailureSignalHandler(); //安装处理程序,当程序收到SIGSEGV、SIGILL、SIGFPE、SIGABRT、SIGBUS、SIGTERM信号而崩溃时,
默认情况下,信号处理程序将把故障(信号信息和堆栈)转储写入标准错误。可以通过InstallFailureWriter()安装自己的writer函数来定制目标。
如果希望对所有线程使用故障信号处理程序,则应该在创建线程之前调用该函数。堆栈跟踪将只显示接收信号的线程。换句话说,不会显示其他线程的堆栈跟踪。
1>条件检测
CHECK(condition) //测试条件condition是否正确
源码分析
#define CHECK(condition) LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) << "Check failed: " #condition " "
当检测的条件不成立是,执行 FATAL ( 致命的)级别的打印,并退出
#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2) // 检测 val1 是否等于 val2
#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2) // 检测 val1 是否不等于 val2
#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2) // 检测 val1 是否小于等于 val2
#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2) // 检测 val1 是否小于 val2
#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2) // 检测 val1 是否大于等于 val2
#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2) // 检测 val1 是否大于 val2
CHECK_NOTNULL(val) //检测val是否不为空NULL
2> 字符串char*检测
#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2) //检测字符串 s1 和 s2 相同
#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同
#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2) //检测字符串 s1 和 s2 相同,忽略大小写
#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同,忽略大小写
3> 浮点数比较
#define CHECK_DOUBLE_EQ(val1, val2) // 检测浮点数 val1 和 val2 相等
#define CHECK_NEAR(val1, val2, margin) // 检测浮点数 val1 和 val2 相等,前后相差margin以内认为是相等的
源码分析
#define CHECK_DOUBLE_EQ(val1, val2) \
do { \
CHECK_LE((val1), (val2)+0.000000000000001L); \
CHECK_GE((val1), (val2)-0.000000000000001L); \
} while (0)
#define CHECK_NEAR(val1, val2, margin) \
do { \
CHECK_LE((val1), (val2)+(margin)); \
CHECK_GE((val1), (val2)-(margin)); \
} while (0)
参数设置,以命令行参数的方式设置标志参数来控制日志记录行为
严重性分级,根据日志严重性分级记录日志
可有条件地记录日志信息
条件中止程序。丰富的条件判定宏,可预设程序终止条件
异常信号处理。程序异常情况,可自定义异常处理过程
支持debug功能。可只用于debug模式
自定义日志信息
线程安全日志记录方式
系统级日志记录
google perror风格日志信息
精简日志字符串信息