文章目录
- 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