glog
简介
glog是google的一个c++开源日志系统,轻巧灵活,入门简单,而且功能也比较完善。支持以下功能
- 严重性分级(INFO, WARNING, ERROR, FATAL). 可以根据日志严重性分级记录日志
- 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为
- 可有条件地记录日志信息
- 条件中止程序,丰富的条件判定宏,可预设程序终止条件
- 异常信号处理,程序异常情况,可自定义异常处理过程。
相比于std::cout的优势:
- glog可以实现日志级别管理,这使得开发者可以轻松的控制哪些信息应该记录以及如何记录,std::cout只能进行基本的输出
- glog可以实现日志输出控制,可以灵活地决定日志输出到哪里
- glog具有性能优势,支持异步日志记录,可以减少对主执行流的干扰。
- glog可以实现自动附加信息,自动记录每条消息的时间戳、日志级别,文件名和行号,对于调试和追踪问题非常有用。
- glog可以实现条件和检测宏,如CHECK, CHEK_EQ, CHECK_NE
总结: std::cout适合简单程序中的基本文本输出,glog适合大型项目。
使用方式
#include <glog/logging.h>
int main(int argc, char* argv[]) {
// Initialize Google's logging library.
google::InitGoogleLogging(argv[0]);
// 解析命令行中的flag,
google::ParseCommandLineFlags(&argc, &argv, true);
LOG(FATAL) << 0;
LOG(ERROR) << 1;
LOG(WARNING) << 2
LOG(INFO) << 4;
FLAGS_minloglevel = 0; // google::INFO level, 只有比严重性minloglevel高log才会输出到终端
FLAGS_log_dir = /tmp/log; //设置log保存的路径
// 条件log
for (int i = 0 ; i < 100; i++) {
LOG_IF(INFO, i > 10) << "Got lots of cookies"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie"; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息。
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; //当此语句执行的前 20 次都输出日志,然后不再输出
}
// CHECK宏
int check_num = 0;
CHECK(check_num == 0) << "check_num is not zero";
// 在程序末尾,最好调用google::ShutdownGoogleLogging()来清理glog使用的资源
google::ShutdownGoogleLogging();
}
参考:
- https://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html
- https://github.com/AngryHacker/articles/blob/master/src/open_source_components/google_glog.md
gflags
gflags是google开源的用于处理命令行参数的项目。
#include <iostream>
#include <gflags/gflags.h>
/**
* 定义命令行参数变量
* 默认的主机地址为 127.0.0.1,变量解释为 'the server host'
* 默认的端口为 12306,变量解释为 'the server port'
*/
DEFINE_string(host, "127.0.0.1", "the server host");
DEFINE_int32(port, 12306, "the server port");
DEFINE_bool(is_open, false, "the door is open");
DEFINE_double(price, 12.0, "the price");
int main(int argc, char** argv) {
// 解析命令行参数,一般都放在 main 函数中开始位置
gflags::ParseCommandLineFlags(&argc, &argv, true);
// 访问参数变量,加上 FLAGS_
std::cout << "The server host is: " << FLAGS_host
<< ", the server port is: " << FLAGS_port << std::endl;
return 0;
}
reference: https://github.com/AngryHacker/articles/blob/master/src/open_source_components/google_glog.md