当前位置:   article > 正文

Google 出的C++轻量级日志库_GLog_了解_使用_glog/logging.h

glog/logging.h

1、Google Logging(glog)是一个C++轻量级、稳定、开源的日志系统日志库,是一个实现应用程序级日志记录的C++98库,支持以下功能:

◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2、GLog日志级别:

glog拥有的4个日志等级,由低到高分别是:
    INFO,
    WARNING,
    ERROR,
    FATAL分别对应0,1,2,3.数值越大严重性越高,严重性高的日志不但会保存到自己的日志文件中,还会同时保存到所有比它严重性更低的日志文件中.例如:ERROR信息会被同时打印到INFO,WARNING,ERROR日志文件中。

LOG(INFO) <<"info test";//输出一个Info日志
LOG(WARNING) <<"warning test";//输出一个Warning日
LOG(ERROR) <<"error test";//输出一个Error日志
LOG(FATAL) <<"fatal test";//输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3、GLog分类:

1、日志分类:

    LOG    //内置日志

    VLOG    //自定义日志

    DLOG    //DEBUG模式可输出的日志

    DVLOG    //DEBUG模式可输出的自定义日志

    SYSLOG    //系统日志,同时通过 syslog() 函数写入到/var/log/message 文件

    PLOG    //perror风格日志,设置errno状态并输出到日志中

    RAW_LOG       //线程安全的日志
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2、条件型LOG

    条件型LOG包括:LOG_IF,LOG_EVERY_N,LOG_IF_EVERY_N,LOG_FIRST_N等.    
    
    
    例如:
    
    //注意FLAGS_log_dir指定的路径,必须手动先创建好,否则生成不了日志文件,另外路径'\'要记得转义.
    FLAGS_log_dir = "D:\\helenxr_glog_log_dir";
    //programe name:"HelenXR_glog_program"
    google::InitGoogleLogging("HelenXR_glog_program");
    //LOG(INFO) << "google log first info level message!";
    //LOG(WARNING) << "google log first warning level message!";
    //LOG(ERROR) << "google log first error level message!";

    //Conditional logging test
    int test_number = 5;
    //LOG_IF:条件满足时执行打印.
    LOG_IF(INFO, test_number > 5) << "LOG_IF:test_number > 5";//no log this message
    LOG_IF(INFO, test_number == 5) << "LOG_IF:test_number == 5";//log this message
    //LOG_EVERY_N:此代码每执行过N此后,打印一次,注:第一次也会打印.
    int loop_count = 0;
    while (loop_count++ < 50 - 1) {
        LOG_EVERY_N(INFO,10) << "LOG_EVERY_N:[" << loop_count  << "]:"<<"loop in " << google::COUNTER << "th times.";
    }
    //LOG_IF_EVERY_N:条件满足情况下每N次,打印一次.注:第一次满足条件也会打印.
    loop_count = 0;
    while (loop_count++ < 50 - 1) {
        LOG_IF_EVERY_N(INFO, (loop_count % 2 == 0),10) << "LOG_IF_EVERY_N:[" << loop_count << "]:" << "loop in " << google::COUNTER << "th times.";
    }
    //LOG_FIRST_N:此代码执行的前N此都打印,超过N次后不打印.
    loop_count = 0;
    while (loop_count++ < 50 - 1) {
        LOG_FIRST_N(INFO,10) << "LOG_FIRST_N:[" << loop_count << "]:" << "loop in " << google::COUNTER << "th times.";
    }
    google::ShutdownGoogleLogging();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

4、调试模式支持

glog提供了一些调试模式时输出,正常模式下不输出的宏,
DLOG,DLOG_IF,DLOG_EVERY_N等.这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度.


    例如:
    
    //Debug Mode support test
    //如果你工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.
    DLOG(INFO) << "DLOG:Debug Mode Message!";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5、GLog提供的宏设置:

1、Verbose

    glog提供VLOG宏来提供自定义打印等级的功能.
    可以通过命令行"--v=n",来控制VLOG的输出:
        VLOG(x),x<=n的情况,VLOG会输出,否则不输出.
        v默认为0,所以默认情况下VLOG(-1),VLOG(0)能够输出.

    例如:
    
    //verbose logging test
    //你可以通过命令行"--v=n",来控制VLOG的输出,VLOG(x),x<=n的情况,VLOG会输出,否则不输出.v默认为0,所以默认情况下VLOG(-1),VLOG(0)能够输出.
    VLOG(-1) << "VLOG(-1) message.";
    VLOG(0) << "VLOG(0) message.";
    VLOG(1) << "VLOG(1) message.";
    VLOG(2) << "VLOG(2) message.";
    VLOG(3) << "VLOG(3) message.";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2、CHECK宏

    CHECK宏的目标是让异常情况尽早被检测到,它的特点就是当所检测条件不满足时,应用程序会中止(类似C语言的assert),同时会以最高等级FATAL写入日志中.

    例如:
    //CHECK macros test
    test_number = 1;
    CHECK(test_number == 2) << " but test_number != 2";

    上面的代码,会触发你的应用程序中止,并记录到日志中,FATAL日志信息。     
    如下:

    Log file created at: 2017/04/26 18:20:24
    Running on machine: PC-2016-0510-9
    Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
    F0426 18:20:24.066536 11560 glog.cpp:53] Check failed: test_number == 2 but test_number != 2



    还有很多CHECK_XXX宏可以使用,详细见”glog\logging.h”文件.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

6、glog日志文件相关设置

1、glog默认是输出到stderr,可以通过初始化参数或设置输出日志目录,修改输出到指定文件。

    在终端打印出的消息的格式:<Serverity level><number> <time>.<number> <pid> <file>:<line number> <messages>.
  • 1

2、glog输出到指定文件:

    如果没有初始化设置日志存放的文件夹,它们会被存放到指定的路径:
    
    linux中,初始化参数默认是输出到/tmp目录下,格式为 “...log....”。
    windows平台上会默认存放到$(LOCALAPPDATA)的Temp文件夹下,如:C:\Users\dell\AppData\Local\Temp
  • 1
  • 2
  • 3
  • 4

3、设置日志文件输出位置,模式:

    注意指定的路径,必须手动存在,你可以在运行前先创建好,否则生成不了日志文件,路径'\'要转义。
    
    FLAGS_log_dir = “”; //设置日志文件输出目录
    FLAGS_alsologtostderr = false; //日志记录到文件的同时输出到strerr
    FLAGS_max_log_size = 1800; //最大日志大小(MB), 如果设置为0将默认为1
  • 1
  • 2
  • 3
  • 4
  • 5

4、其他参数查找在glog/logging.h文件中

5、日志文件命名:如果可执行文件名为 “test”,则将日志输出到文件后,还会生成 test.ERROR,test.WARNING,test.INFO 三个链接文件,分别链接到对应级别的日志文件。

    文件名格式:<program name>.<host name>.<user name>.log.<Severity level>.<date>-<time>.<pid>;
    文件名格式:[文件名].[计算机名].[Windows用户名].[log].[等级].[年月日时分秒].[PID]例如:abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-112354.3108
  • 1
  • 2

6、错误输出:

    比如有空指针引用等报错,默认只会输出segment fault。
    通过 google::InstallFailureSignalHandler()即可注册,将 core dumped 信息输出到 stderr。

    google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式,SIGSEGV:segment fault报错。
  • 1
  • 2
  • 3
  • 4

7、几个参数设置:

FLAGS_##name

FLAGS_后面加宏名字。

FLAGS_logtostderr = true;           //设置日志消息是否转到标准输出而不是日志文件
FLAGS_alsologtostderr = true;       //设置日志消息除了日志文件之外是否去标准输出
FLAGS_colorlogtostderr = true;      //设置记录到标准输出的颜色消息(如果终端支持)
FLAGS_log_prefix = true;            //设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 0;               //设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size = 10;            //设置最大日志文件大小(以MB为单位),日志大小大于10M时,创建新的日志
FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘



DECLARE_bool(timestamp_in_logfile_name);    //设置是否将时间戳附加到日志文件名

DECLARE_bool(logtostdout);                  //设置日志消息是否转到标准输出而不是日志文件

DECLARE_bool(colorlogtostdout);             //设置记录到标准输出的颜色消息(如果终端支持)。

DECLARE_bool(logtostderr);                  //设置日志消息是否转到stderr标准输出而不是日志文件

DECLARE_bool(alsologtostderr);              //设置除了日志文件之外,日志消息是否转到stderr标准输出。

DECLARE_bool(colorlogtostderr);             //设置记录到stderr的颜色消息(如果终端支持)。

DECLARE_int32(stderrthreshold);             //级别>=的日志消息除了日志文件外,还会自动发送到stderr。

DECLARE_bool(log_file_header);              //设置创建文件时是否应写入日志文件头。

DECLARE_bool(log_prefix);                   //设置是否应在每行输出前加上日志前缀。

DECLARE_bool(log_year_in_prefix);           //设置年份是否应包含在日志前缀中。

DECLARE_int32(logbuflevel);                 //缓冲级别<=此标志的日志消息。较高级别的日志消息将立即刷新。

DECLARE_int32(logbufsecs);                  //设置日志缓冲的最大秒数。

DECLARE_int32(minloglevel);                 //日志抑制级别:低于此级别的日志消息将被抑制。

DECLARE_string(log_dir);                    //如果指定,日志文件将写入此目录,而不是默认日志目录。

DECLARE_int32(logfile_mode);                //设置日志文件模式。

DECLARE_string(log_link);                   //设置目录的路径,在该目录中放置指向日志文件的其他链接。

DECLARE_int32(v);                           //在vlog_is_on.cc中

DECLARE_string(vmodule);                    //也在vlog_is_on.cc中

DECLARE_uint32(max_log_size);               //设置最大日志文件大小(MB)。日志大小大于10M时,创建新的日志。

DECLARE_bool(stop_logging_if_full_disk);    //设置磁盘已满时是否避免记录到磁盘。

DECLARE_bool(log_utc_time);                 //使用UTC时间记录
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

8、几个函数:

google::SetLogDestination(google::GLOG_INFO, "log/prefix_");  //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀


google::SetLogFilenameExtension(“logExtension”); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别

google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出


2、使用glog之前必须先初始化库,要生成日志文件只需在开始log之前调用一次:  google::InitGoogleLogging(argv[0]);  //括号内是程序名或者"程序名testlog"

当要结束glog时必须关闭库,否则会内存溢出:
    google::ShutdownGoogleLogging();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

9、安装glog

1、cd ~

2、git clone https://github.com/google/glog        
或者下载源码压缩包: 
    https://gitcode.net/mirrors/google/glog?utm_source=csdn_github_accelerator

3、sudo apt-get install autoconf automake libtool
4、cd glog
5、mkdir build
6、cd build

编译x86:
7、cmake ..

编译arm:
    需要用到cross_compile.cmake这个文件。
    cmake -DCMAKE_TOOLCHAIN_FILE=/home/zwh/workspace/zpilot/autosarAP/tools/cross_compile.cmake

    查看库是x86还是arm版本:

    file libglog.so.0.7.0

8、make 
9、sudo make install

    最后还要注意要使用sudo ldconfig一下,让系统载入这三个动态库。
10、sudo ldconfig


库会默认安装在 /usr/local/lib/ 下,
头文件放在 /usr/local/include/glog/  
 
注意:这里直接使用的lglog,表示在系统默认路径下(一般是/usr和/usr/local/lib目录)寻找库文件libglog.so。一般情况下,你到/usr/local/lib目录下你会发现这个libglog.so是个链接文件。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

所以,你也可以直接使用这个库文件,将这个库文件放在你需要的目录下使用。

项目中使用libglog库:
  • 1

例如,在项目里,需要将所有的动态库文件放在一起,如统一放在project/lib目录下。那么,你可以将/usr/local/lib中的libglog.so.0.5.0(或者是glog源码目录下bulid目录下的libglog.so.0.5.0)拷贝到你项目工程目录下的lib目录下,即projiect/lib路径下。并将文件名称修改为libglog.so。

find_package (glog 0.6.0 REQUIRED)

add_executable (myapp main.cpp)
target_link_libraries (myapp glog::glog)



https://github.com/google/glog#cmake
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

10、包含头文件

#include <glog/logging.h>
  • 1

11、使用glog

#include <iostream>
#include <glog/logging.h>

int main(int argc, char* argv[]) {

    google::InitGoogleLogging(argv[0]);
    或者:google::InitGoogleLogging("test_glog");(可以当作日志文件名使用)
    std::string str = "nihao hello word";
    FLAGS_log_dir = "/tmp/logs/"; 
    LOG(INFO) << "hello world";
    
    
    for (int i = 0; i < 100; i++) {
        LOG(INFO) << str << i;
    }

    google::ShutdownGoogleLogging();
    return 0;
}


编译:g++ glogtest.cpp -o glogtest -lglog
    
    或:
    
    g++ main.cpp -lglog -o test
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/395651
推荐阅读
相关标签
  

闽ICP备14008679号