https://github.com/google/glog
为什么用glog
* 由于Qt没有真正的Log框架,并且log4Qt已很久没更新了,而log4cpp和boost::log又太重, 因此打算在分布式IP音频广播系统中使用glog或spdlog作为日志框架.
* glog and spdlog都是轻量级日志框架, spdlog即仅有CPP11头文件,更轻量; 但是由于google是大IP,应该比spdlog更稳定和可持续性更强, 并且glog结合gflags使用是非常高效开发的组合,SO,选择glog,仅此而已.
* 20190419下载的最新版的说明中发现已支持windows下的CMake Build, 具体看README.windows
linux下的安装
Installing Glog on Ubuntu (offical doc:
https://github.com/google/glog/wiki/Installing-Glog-on-Ubuntu-14.04
)
源码安装
sudo apt-get install autoconf automake libtool
sudo apt-get install libgflags-dev #(1)建议安装,因为glog在安装时会检测是否安装了gflag,如果安装了,会支持gflag.
./autogen.sh && ./configure && make -j 4 && sudo make install (未测试)
apt安装
sudo apt-get install autoconf automake libtool
sudo apt-get install libgflags-dev #(1)建议安装,因为glog在安装时会检测是否安装了gflag,如果安装了,会支持gflag.
sudo apt install libgoogle-glog-dev (已安装确认)
Qt下使用glog总结
#pragma comment(lib,”libglog.lib”) //win
target_link_libraries(${PROJECT_NAME} -lglog) //linux
GLOG 有四个错误级别,枚举如下:
enum SeverityLevel{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
glog default将日志输出到stderr, 比如Qt-demo的app output中输出如下:
11:28:08: Debugging starts
WARNING: Logging before InitGoogleLogging() is written to STDERR
I0419 11:28:09.086876 19775 main.cpp:12] server already run. //LOG(INFO)<<“server already run. “;
常用的运行参数如下
logtostderr (bool, default=false) //是否将所有日志输出到 stderr,而非文件
alsologtostderr(bool,default=false) //是否同时将日志输出到文件和stderr
minloglevel (int, default=google::INFO) //限制输出到 stderr 的部分信息,包括此错误级别和更高错误级别的日志信息
stderrthreshold (int, default=google::ERROR) //除了将日志输出到文件之外,还将此错误级别和更高错误级别的日志同时输出到 stderr,这个只能使用 -stderrthreshold=1 或代码中设置,而不能使用环境变量的形式。(这个参数可以替代上面两个参数)
colorlogtostderr(bool, default=false) //将输出到 stderr 上的错误日志显示相应的颜色
v (int, default=0) //只记录此错误级别和更高错误级别的 VLOG 日志信息
log_dir (string, default="") //设置日志文件输出目录
v (int, default=0) //只有当自定义日志(VLOG)级别值小于此值时,才进行输出,默认为0(注:自定义日志的优先级与GLOG内置日志优级相反,值越小优先级越高!!!)。
vmodule (string, default="") //分文件(不包括文件名后缀,支持通配符)设置自定义日志的可输出级别,如:GLOG_vmodule=server=2,client=3 表示文件名为server.* 的只输出小于 2 的日志,文件名为 client.* 的只输出小于 3 的日志。如果同时使用 GLOG_v 选项,将覆盖 GLOG_v 选项。
运行参数设置也可以在代码里通过加上FLAGS_前缀来设置.
FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;
FLAGS_stderrthreshold 输出到stderr的门限,默认为2(ERROR),默认,ERORR以下的信息不打印到终端
FLAGS_alsologtostderr 当这个全局变量为真时,忽略FLAGS_stderrthreshold的限制,所有信息打印到终端
FLAGS_colorlogtostderr 错误等级有颜色区分
google::SetLogDestination(google::ERROR,"log/prefix_"); //第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀。
google::SetStderrLogging(google::INFO); //输出到标准输出的时候大于 INFO 级别的都输出;等同于 FLAGS_stderrthreshold=google::INFO;
FLAGS_logbufsecs =0; //实时输出日志
FLAGS_max_log_size =100; //最大日志大小(MB)
#define GOOGLE_STRIP_LOG 3 // 小于此级别的日志语句将在编译时清除,以减小编译后的文件大小,必须放在 #include 前面才有效。
条件输出
LOG_IF(INFO, num_cookies > 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 次都输出日志,然后不再输出
ERROR:unknown command line flag ‘logtostderr’
产生原因, 一般而言,从源代码编译安装glog时,会默认依赖gflags。如果此时gflags没有安装,编译安装的glog将无法使用gflags相关的命令,因此也无法在可执行程序后添加“ –logtostderr”。
下面是一个完整的基于Qt的glog的测试用例,测试glog的基本概念和最常见的用法的代码和结果分析
https://gitee.com/xingsharp/glog_test
|
这是运行两次glog_test后的最新的WARNING_glog_test_x摘录 Log file created at: 2019/04/19 16:48:12 Running on machine: xhj_ip_bc Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg W0419 16:48:12.653614 25632 main.cpp:38] warning test E0419 16:48:12.653704 25632 main.cpp:39] error test F0419 16:48:12.653786 25632 main.cpp:44] fatal test |
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <glog/logging.h>
using namespace std;
int main(int argc, char *argv[]){
QCoreApplication a(argc, argv);
qDebug()<<"begin glog ini............";
// glog run time config. -----------------------
google::InitGoogleLogging(argv[0]);//Initialize Google's logging library, argv[0] is program name.
// set Param--------------------------------
//<way1> 通过GFLAGS来设置参数; FLAGS_xxx = xx
FLAGS_stderrthreshold = google::ERROR; //INFO WARNING ERROR FATAL, 默认输出到stderr(app Output/cli)的阀值是ERROR
FLAGS_alsologtostderr = false; //当这个全局变量为真时,忽略FLAGS_stderrthreshold的限制,所有信息打印到终端
FLAGS_colorlogtostderr = true; //设置输出到屏幕的日志显示相应颜色,错误等级有颜色区分
FLAGS_max_log_size = 100; //Maximum log size: 100MB
FLAGS_logbufsecs =0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
//<wah2>
//set log path;第一个参数为日志级别设置,级别高于 google::INFO 的日志同时输出到屏幕,第二个参数表示输出目录及日志文件名前缀,log目录我是事先在build-prj目录下创建好.
google::SetLogDestination(google::INFO, "log/INFO_");
google::SetLogDestination(google::WARNING,"log/WARNING_"); //设置 google::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::ERROR, "log/ERROR_"); //设置 google::ERROR 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::FATAL, "log/FATAL_"); //设置 google::FATAL 级别的日志存储路径和文件名前缀
google::SetLogFilenameExtension("glog_test_"); //设置文件名扩展,如平台?或其它需要区分的信息
// glog test -----------------------------------
qDebug()<<"begin glog test........... ";
LOG(INFO)<<"LOG(INFO):hello world";
LOG(INFO)<<"Found "<<google::COUNTER<<endl;
LOG(WARNING)<<"warning test";
LOG(ERROR)<<"error test";
LOG(FATAL)<<"fatal test"; //place here,because the Macro let the program exit.
// google::ShutdownGoogleLogging();
return a.exec();
}