赞
踩
◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息
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日志,这是最严重的日志并且输出之后会中止程序
LOG //内置日志
VLOG //自定义日志
DLOG //DEBUG模式可输出的日志
DVLOG //DEBUG模式可输出的自定义日志
SYSLOG //系统日志,同时通过 syslog() 函数写入到/var/log/message 文件
PLOG //perror风格日志,设置errno状态并输出到日志中
RAW_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();
glog提供了一些调试模式时输出,正常模式下不输出的宏,
DLOG,DLOG_IF,DLOG_EVERY_N等.这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度.
例如:
//Debug Mode support test
//如果你工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.
DLOG(INFO) << "DLOG:Debug Mode Message!";
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.";
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”文件.
在终端打印出的消息的格式:<Serverity level><number> <time>.<number> <pid> <file>:<line number> <messages>.
如果没有初始化设置日志存放的文件夹,它们会被存放到指定的路径:
linux中,初始化参数默认是输出到/tmp目录下,格式为 “...log....”。
windows平台上会默认存放到$(LOCALAPPDATA)的Temp文件夹下,如:C:\Users\dell\AppData\Local\Temp
注意指定的路径,必须手动存在,你可以在运行前先创建好,否则生成不了日志文件,路径'\'要转义。
FLAGS_log_dir = “”; //设置日志文件输出目录
FLAGS_alsologtostderr = false; //日志记录到文件的同时输出到strerr
FLAGS_max_log_size = 1800; //最大日志大小(MB), 如果设置为0将默认为1
文件名格式:<program name>.<host name>.<user name>.log.<Severity level>.<date>-<time>.<pid>;
文件名格式:[文件名].[计算机名].[Windows用户名].[log].[等级].[年月日时分秒].[PID]例如:abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-112354.3108
比如有空指针引用等报错,默认只会输出segment fault。
通过 google::InstallFailureSignalHandler()即可注册,将 core dumped 信息输出到 stderr。
google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式,SIGSEGV:segment fault报错。
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时间记录
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、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是个链接文件。
所以,你也可以直接使用这个库文件,将这个库文件放在你需要的目录下使用。
项目中使用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
#include <glog/logging.h>
#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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。