Qt在ubuntu server中使用glog工作笔记

  • Post author:
  • Post category:其他



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();
}



版权声明:本文为u012915636原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。