Google 出的C++轻量级日志库_GLog_了解_使用

news/2025/1/8 21:01:55/

文章目录

  • 1、Google Logging(glog)是一个C++轻量级、稳定、开源的日志系统日志库,是一个实现应用程序级日志记录的C++98库,支持以下功能:
  • 2、GLog日志级别:
  • 3、GLog分类:
    • 1、日志分类:
    • 2、条件型LOG
  • 4、调试模式支持
  • 5、GLog提供的宏设置:
    • 1、Verbose
    • 2、CHECK宏
  • 6、glog日志文件相关设置
    • 1、glog默认是输出到stderr,可以通过初始化参数或设置输出日志目录,修改输出到指定文件。
    • 2、glog输出到指定文件:
    • 3、设置日志文件输出位置,模式:
    • 4、其他参数查找在glog/logging.h文件中
    • 5、日志文件命名:如果可执行文件名为 “test”,则将日志输出到文件后,还会生成 test.ERROR,test.WARNING,test.INFO 三个链接文件,分别链接到对应级别的日志文件。
    • 6、错误输出:
  • 7、几个参数设置:
  • 8、几个函数:
  • 9、安装glog
  • 10、包含头文件
  • 11、使用glog

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

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

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日志,这是最严重的日志并且输出之后会中止程序

3、GLog分类:

1、日志分类:

    LOG    //内置日志VLOG    //自定义日志DLOG    //DEBUG模式可输出的日志DVLOG    //DEBUG模式可输出的自定义日志SYSLOG    //系统日志,同时通过 syslog() 函数写入到/var/log/message 文件PLOG    //perror风格日志,设置errno状态并输出到日志中RAW_LOG       //线程安全的日志

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 testint test_number = 5;//LOG_IF:条件满足时执行打印.LOG_IF(INFO, test_number > 5) << "LOG_IF:test_number > 5";//no log this messageLOG_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();

4、调试模式支持

glog提供了一些调试模式时输出,正常模式下不输出的宏,
DLOG,DLOG_IF,DLOG_EVERY_N等.这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度.例如://Debug Mode support test//如果你工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.DLOG(INFO) << "DLOG:Debug Mode Message!";

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.";

2、CHECK宏

    CHECK宏的目标是让异常情况尽早被检测到,它的特点就是当所检测条件不满足时,应用程序会中止(类似C语言的assert),同时会以最高等级FATAL写入日志中.例如://CHECK macros testtest_number = 1;CHECK(test_number == 2) << " but test_number != 2";上面的代码,会触发你的应用程序中止,并记录到日志中,FATAL日志信息。     如下:Log file created at: 2017/04/26 18:20:24Running on machine: PC-2016-0510-9Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msgF0426 18:20:24.066536 11560 glog.cpp:53] Check failed: test_number == 2 but test_number != 2还有很多CHECK_XXX宏可以使用,详细见”glog\logging.h”文件.

6、glog日志文件相关设置

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

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

2、glog输出到指定文件:

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

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

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

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

6、错误输出:

    比如有空指针引用等报错,默认只会输出segment fault。通过 google::InstallFailureSignalHandler()即可注册,将 core dumped 信息输出到 stderr。google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式,SIGSEGV:segment fault报错。

7、几个参数设置:

FLAGS_##nameFLAGS_后面加宏名字。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时间记录

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

9、安装glog

1、cd ~2、git clone https://github.com/google/glog        
或者下载源码压缩包: https://gitcode.net/mirrors/google/glog?utm_source=csdn_github_accelerator3、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.08、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是个链接文件。

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

项目中使用libglog库:

例如,在项目里,需要将所有的动态库文件放在一起,如统一放在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

10、包含头文件

#include <glog/logging.h>

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

http://www.ppmy.cn/news/92715.html

相关文章

GET和POST区别

GET和POST区别 GET&#xff1a;从服务器上获取数据&#xff0c;也就是所谓的查&#xff0c;仅仅是获取服务器资源&#xff0c;不进行修改。 POST&#xff1a;向服务器提交数据&#xff0c;这就涉及到了数据的更新&#xff0c;也就是更改服务器的数据。 PUT&#xff1a;英…

Spring-重新认识IoC二

文章目录 依赖查找的方式依赖注入的方式依赖查找和依赖注入的来源Ioc配置源信息BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器如何使用BeanFactory和ApplcationContext 依赖查找的方式 根据 Bean 名称查找 实时查找延迟查找 根据 Bean 类型查找 单个 Bean 对象集…

8.1.0版本ELK搭建,开启xpack认证机制

8.1.0版本ELK搭建&#xff0c;开启xpack认证机制 部署环境安排下载elk安装包服务器环境配置部署elasticsearch配置认证配置客户端加密的http通信修改elastic配置文件 部署kibana部署logstash部署httpd&#xff0c;filebeat配置kibana页面部署grafana配置grafana连接elastic 部署…

2022年都快结束了,还有人不会安卓录屏?在安卓上录制屏幕的的实现方式

前言 在我之前的文章 《以不同的形式在安卓中创建GIF动图》 中&#xff0c;我挖了一个坑&#xff0c;可以通过录制屏幕后转为 GIF 的方式来创建 GIF。只是当时我只是提了这么一个思路&#xff0c;并没有给出录屏的方式&#xff0c;所以本文的内容就是教大家如何通过调用系统 A…

考研C语言第四章

4.1 关系表达式与逻辑表达式 ps&#xff1a; 算术运算符&#xff1a;加减乘除等 关系运算符&#xff1a;比大小的 逻辑与逻辑或 非&#xff01;的运算级别&#xff08;应该&#xff09;最高 4.2 if-else #include <stdio.h> //上课这个写while的原因是方便一次一次…

2023-05-27 Unity 2进制4——类对象的序列化与反序列化

文章目录 一、序列化二、反序列化 一、序列化 &#xff08;一&#xff09;声明类对象 ​ 如果要使用 C# 自带的序列化 2 进制方法&#xff0c;申明类时需要添加[System.Serializable]特性。 [System.Serializable] public class Person {public int age 1;public string na…

Systrace系列6 —— Input 解读

本文主要是对 Systrace 中的 Input 进行简单介绍,介绍其 Input 的流程; Systrace 中 Input 信息的体现 ,以及如何结合 Input 信息,分析与 Input 相关的问题。 在Android 基于 Choreographer 的渲染机制详解 这篇文章中,我有讲到,Android App 的主线程运行的本质是靠 Mess…

DRF之过滤,排序,分页

一、权限组件源码解读 1.继承了APIView 才有的---》执行流程---》dispatch中----》三大认证 APIView的dispatch def initial(self, request, *args, **kwargs):self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request) 2 读…