glog:日志输出

支持debug功能

glog提供特定的宏只在debug模式下生效。以下分别对应LOG、LOG_IF、DLOG_EVERY_N操作的专用宏。

DLOG(INFO) << "Found cookies";

DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";

判定大小关系: CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用这些宏需要注意类型一致,如果出现类型不一致的,可使用static_cast转换。

判定指针是否为空:CHECK_NOTNULL(some_ptr),可用于对象初始化的时候。

判定字符串是否相等:CHECK_STREQ, CHECK_STRNE, CHECK_STRCASEEQ, CHECK_STRCASENE。可进行大小写敏感或不敏感字符串来分别判定。

判定浮点是否相等或相近:CHECK_DOUBLE_EQ,CHECK_NEAR。这两个宏都需要指定一个可容忍的偏差上限。

gflags:命令行参数解析

将需要的命令行参数使用gflags的宏:DEFINE_xxxxx(变量名,默认值,help-string) 定义在文件当中,注意全局域哦。gflags支持以下类型:

  • DEFINE_bool: boolean
  • DEFINE_int32: 32-bit integer
  • DEFINE_int64: 64-bit integer
  • DEFINE_uint64: unsigned 64-bit integer
  • DEFINE_double: double
  • DEFINE_string: C++ string
google::ParseCommandLineFlags(&argc, &argv, true);
第三个参数的作用:
如果设为true,则该函数处理完成后,argv中只保留argv[0],argc会被设置为1。
如果为false,则argv和argc会被保留,但是注意函数会调整argv中的顺序。

这样,在后续代码中可以使用FLAGS_变量名访问对应的命令行参数了

最后,编译成可执行文件之后,用户可以使用:executable --参数1=值1 --参数2=值2 ... 来为这些命令行参数赋值。

这里值得注意的是bool类型命令行参数,除了可以使用--xxx=true/false之外,还可以使用--xxx和--noxxx后面不加等号的方式指定true和false

在其他文件中使用定义的flags变量:有些时候需要在main之外的文件使用定义的flags变量,这时候可以使用宏定义DECLARE_xxx(变量名)声明一下(就和c++中全局变量的使用是一样的,extern一下一样)

  • DECLARE_bool: boolean
  • DECLARE_int32: 32-bit integer
  • DECLARE_int64: 64-bit integer
  • DECLARE_uint64: unsigned 64-bit integer
  • DECLARE_double: double
  • DECLARE_string: C++ string
    在gflags的doc中,推荐在对应的.h文件中进行DECLARE_xxx声明,需要使用的文件直接include就行了。
  1. 定制你自己的help信息与version信息:(gflags里面已经定义了-h和--version,你可以通过以下方式定制它们的内容)

    • version信息:使用google::SetVersionString设定,使用google::VersionString访问
    • help信息:使用google::SetUsageMessage设定,使用google::ProgramUsage访问
    • 注意:google::SetUsageMessage和google::SetVersionString必须在google::ParseCommandLineFlags之前执行

main.cc:

#include <glog/logging.h>
#include <gflags/gflags.h>DEFINE_string(file_path, "", "input file path"); // 不一定放在main函数中
DEFINE_bool(verbose, false, "whether to print log"); // 调试开关
DEFINE_double(rate, 2.0, ""); // 代替宏定义int main(int argc, char *argv[]) {google::InitGoogleLogging(argv[0]); // 初始化glogFLAGS_logtostderr = 1;FLAGS_colorlogtostderr = 1;gflags::SetUsageMessage("\nusage: ./test --file_path <file_path>");google::ParseCommandLineFlags(&argc, &argv, true);  // 初始化gflagsstd::string file_path = FLAGS_file_path;if (file_path.empty()) {gflags::ShowUsageWithFlagsRestrict(argv[0], "main");LOG(FATAL) << "file_path is empty !";}CHECK(!FLAGS_file_path.empty()) << "file path is empty";for(int index = 0; index <= 10; ++index) {LOG(INFO) << "index: " << index;LOG_IF(INFO, index > 5) << "  --> index > 5"; // 当index > 5时输出logLOG_EVERY_N(WARNING, 5) << "  --> index % 5 == 0"; // 每隔5次输出一次logLOG_IF_EVERY_N(ERROR, index < 5, 2) << "  --> index < 5, i % 2 == 0"; // 当index < 5时每隔2次输出一次log;LOG_FIRST_N(INFO, 8) << "  --> index < 8"; // 输出前8次log}DLOG(INFO) << "Debug Mode Message!"; // debug模式输出log,release模式不输出google::ShutdownGoogleLogging();return 0;
}

CMakeList.txt:

cmake_minimum_required(VERSION 2.8)
project(test)set(CMAKE_BUILD_TYPE "Debug") # Debug/Release
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)find_package(gflags REQUIRED)
include_directories(${gflags_INCLUDE_DIR})
find_package(Glog REQUIRED)
include_directories(${GLOG_INCLUDE_DIRS})add_executable(test main.cc)
target_link_libraries(test glog::glog gflags)

$ ./bin/test

test:
usage: ./test --file_path <file_path>Flags from /home/ubuntu/test/main.cc:-file_path (input file path) type: string default: ""-rate () type: double default: 2-verbose (whether to print log) type: bool default: false
F0601 20:30:42.405541 32641 main.cc:19] file_path is empty !
*** Check failure stack trace: ***@           0x414be6  google::LogMessage::Fail()@           0x414b2a  google::LogMessage::SendToLog()@           0x414466  google::LogMessage::Flush()@           0x417f87  google::LogMessageFatal::~LogMessageFatal()@           0x410daa  main@     0x7fa34acdf830  __libc_start_main@           0x410ba9  _start@              (nil)  (unknown)
Aborted (core dumped)

$ ./bin/test --file_path /home/

默认情况下,日志会写入本地/tmp/文件夹中,文件名格式:

<program name>.<host name>.<user name>.log.<Severity level>.<date>-<time>.<pid>

如:在/tmp下生成

main.INFO -> main.ubuntu.alan.log.INFO.20191022-150504.49837

main.ubuntu.alan.log.INFO.20191022-150504.49837

默认情况下,GLog还会将ERROR和FATAL错误记录到stderr消息中(会在终端打印出来);

在终端打印出的消息的格式:

<Serverity level><number> <time>.<number> <pid> <file>:<line number> <messages>
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg

如:

I1022 15:05:04.920763 49837 main.cc:20] initial main

glog参数设置:

    FLAGS_log_dir = "./"; // 设置log输出文件夹,默认输出到本地/tmp文件夹下FLAGS_logtostderr = 1; // 设置log输出到stderr,不保存到本地FLAGS_alsologtostderr = 1; // 设置log输出到stderr和本地FLAGS_stderrthreshold = 1; // WARNING以及更高级别的log将会记录到stderr中;(INFO: 0, WARNING: 1, ERROR: 2 FATAL: 3)FLAGS_minloglevel = 0; // 默认是0,INFO以及更高级别的Log将会被记录;(INFO: 0, WARNING: 1, ERROR: 2 FATAL: 3)FLAGS_colorlogtostderr = 1; // 设置记录到标准输出的颜色消息(如果终端支持)FLAGS_log_prefix = true; // 设置日志前缀是否应该添加到每行输出FLAGS_logbufsecs = 0;// 设置可以缓冲日志的最大秒数,0指实时输出FLAGS_max_log_size =10;// 设置最大日志文件大小(以MB为单位)FLAGS_stop_logging_if_full_disk = true; // 设置是否在磁盘已满时避免日志记录到磁盘

可在命令行运行程序时指定这些flag,如$ ./exe  -logtostderr true

在其他文件中使用定义的flags变量:有些时候需要在main之外的文件使用定义的flags变量,这时候可以使用宏定义DECLARE_xxx(变量名)声明一下(就和c++中全局变量的使用是一样的,extern一下一样)

  • DECLARE_bool: boolean
  • DECLARE_int32: 32-bit integer
  • DECLARE_int64: 64-bit integer
  • DECLARE_uint64: unsigned 64-bit integer
  • DECLARE_double: double
  • DECLARE_string: C++ string
    在gflags的doc中,推荐在对应的.h文件中进行DECLARE_xxx声明,需要使用的文件直接include就行了。

参考:https://blog.csdn.net/qq_34347375/article/details/86629421


glog重定向

#include <glog/logging.h>
#include "alan/logger.h"Alan::Logger my_logger;class MyLogSink : public google::LogSink {void send(google::LogSeverity severity,const char*         full_filename,const char*         base_filename,int                 line,const struct ::tm*  tm_time,const char*         message,size_t              message_len) override {thread_local std::string msg;msg.assign(message, message_len);Alan::LogLevel my_level;switch (severity) {case google::GLOG_INFO: my_level = Alan::LogLevel::INFO; break;case google::GLOG_WARNING: my_level = Alan::LogLevel::WARN; break;case google::GLOG_ERROR: my_level = Alan::LogLevel::ERROR; break;case google::GLOG_FATAL: my_level = Alan::LogLevel::FATAL; break;default: my_level = Alan::LogLevel::INFO;}my_logger.Log(my_level, "%%:%%] %%", base_filename, line, msg);}
};static MyLogSink my_log_sink;int main(int argc, char *argv[]) {google::InitGoogleLogging(argv[0]);google::AddLogSink(&my_log_sink);// Avoid duplicate logging to stderr with my_logger.FLAGS_stderrthreshold = google::NUM_SEVERITIES;return 0;
}

glog和gflags的使用相关推荐

  1. 安装glog和gflags

    1.下载 git clone https://github.com/google/glog 2.配置 sudo apt-get install autoconf automake libtool 3. ...

  2. gflags和glog在cartographer中的运用

    gflags是什么?gflags是google开源的命令行标记处理库: 那么什么是命令行标记呢?顾名思义就是当运行一个可执行文件时,由用户为其指定的标记,形如: fgrep -l -f ./test ...

  3. 【C++】google glog详解

    0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...

  4. folly库安装(4)folly依赖的重要组件安装:double-conversion, google-gflags, glog, fmt, googletest, boost等

    folly库依赖的组件版本可以在build\fbcode_builder\manifests目录查看,比如需要查看double-conversion的版本,只需要打开double-conversion ...

  5. 在Windows7/10上快速搭建深度学习框架Caffe开发环境

    之前在 http://blog.csdn.net/fengbingchun/article/details/50987353 中介绍过在Windows7上搭建Caffe开发环境的操作步骤,那时caff ...

  6. Ubuntu 14.04 64位机上不带CUDA支持的Caffe配置编译操作过程

    Caffe是一个高效的深度学习框架.它既可以在CPU上执行也可以在GPU上执行. 下面介绍在Ubuntu上不带CUDA的Caffe配置编译过程: 1.      安装BLAS:$ sudo apt-g ...

  7. 从零开始安装 Caffe --CPU only----没有 pycaffe

    最近新发了一台服务器, i7-4790/3.6GHz 处理器, 显卡 GTX 1080 Ti Pascal 开始新一轮的装机旅程. 系统是厂家安装的 Ubuntu14.04 下面从零开始安装Caffe ...

  8. ubuntu 安装 evpp

    ubuntu 安装 evpp 来源 https://www.cnblogs.com/wisdomyzw/p/9402440.html Ubuntu虚拟机安装开源库evpp说明: EVPP为奇虎360基 ...

  9. 深度学习之caffe1——软件配置与测试

    caffe的编译配置真的是很让人头疼啊,不知道试过多少次了~~~ 重装系统了七八次,搞得Linux的一些常用命令倒是很熟悉了~~~ 我有洁癖~~~某一个点上出了错,我一定要把它搞好了,再重新来一次,我 ...

  10. caffe框架翻译-理解(转载)

    本文转自:  http://dirlt.com/caffe.html http://blog.csdn.net/songyu0120/article/details/46817085 1 caffe ...

最新文章

  1. python随机森林筛选变量_变量重要性随机森林在R中是否有类似Python的rfpimp来分组共线变量...
  2. opencv-python将一个视频切成n份视频
  3. 最基本的弹出窗口代码
  4. 【知识发现】基于物品的协同过滤推荐算法python实现
  5. 使用screen后台运行python(基于centOS7.2)
  6. Android(java)学习笔记63:Clock App 编写报错01
  7. 【剑指offer】面试题57 - II:和为s的连续正数序列(Java)
  8. c语言实现图像拼接程序,opencv2实现10张图像上下左右拼接融合分享!
  9. Log4j2日志框架集成Slf4j日志门面
  10. 新乡学院2019计算机报名,新乡学院2019年招生章程
  11. LayUI文档和技术支持网站
  12. 教你同时查询安能物流多个单号的物流情况并保存
  13. CCF-CSP刷题网站推荐(含100分答案)
  14. 计算机软件能删除吗,怎么彻底清除电脑软件鲁大师?卸载对系统有影响吗?
  15. 2019年末,10 位院士对 AI 的深度把脉(下)
  16. C语言构造有理数的函数,创建有理数对象
  17. 六、利用ESP32搭建网络服务器(一)
  18. JavaScript(JS)的基本语法
  19. 腾达ap设置说明_腾达(Tenda)F3无线信号放大模式(Client+AP)设置 | 192路由网
  20. elementUI表格合并单元格详解

热门文章

  1. Safari iOS 清除缓存、在手机端调试方法 [ For Mac ]
  2. EarthWorm结合proxifier的使用学习
  3. EarthWorm 常用命令总结
  4. 2023-07-10 linux IIO子系统使用学习,在TI 的ads1015驱动里面看到相关使用,故花点时间进行简单的学习,入门级别,纪录点滴。
  5. 50道Dubbo面试题
  6. SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息
  7. 平时积累的数据结构题
  8. Linux进程管理中,使用SIGTERM和SIGKILL有什么区别?
  9. 有哪些好用思维导图软件?来看看这几款
  10. postgres_fdw