glog 实践心得

标记选项
  • logtostderr 置位1 将log打印到stderr
  • stderrthreshold 将log 输出到stderr的最低门槛
  • log_dir 设置log文件的存储路径
  • minloglevel 最低输出log的级别,低于这个级别的log,即使在代码中有也不会输出出来
关于minloglevel

它的运用一般在于调试DEBUG,当我们的项目处于DEBUG时,可以打印很多调试log,把log级别定位为 INFO级别,当调试好后把minloglevel设置高于 INFO 级别后,程序关于调试的log就不会被打印出来了,这样十分便利。
虽然低于minloglevel级别的log不会打印出来,但是它们的相应级别文件也会被创建出来,并且低级别的日志文件也会包含高级log的信息,比如WANING的日志文件就会包含WANING及其以上级别的log。

初始化&善后
  • InitGoogleLogging(“程序名”) //如果不调初始化默认输出到stderr 即使后面设置了 dir
  • ShutdownGoogleLogging
glog 如何实现线程安全

我们知道iostream 是线程安全的,但是使用iostream很难实现线程安全,比如:

std::cerr << "hello" << "world";

其实都是调用了operator << 函数,虽然单个 operator << 是线程安全的,但是连着就不一定了,在多线程环境下可能因为调度的原因,就会出现日志错行线程不安全的事件。

#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()

#define COMPACT_GOOGLE_LOG_WARNING google::LogMessage(  __FILE__, __LINE__, google::GLOG_WARNING)

#define COMPACT_GOOGLE_LOG_INFO google::LogMessage(__FILE__, __LINE__)

glog 使用以上方式实现线程安全,每次LOG(INFO)之类的日志输出,都会生成一个临时对象,因为这个对象是在栈上生成所以该对象是线程安全的。生成LogMessage 这个对象后,它的成员stream()函数会返回相应一个对象,这个对象继承了 ostream,所以就实现了 通过<<实现日志输出。

继续stream(),stream接受完用户的输入后保存到其内部,然后LogMessage临时对象生命周期到期,进行析构,析构了调用了Flush进行数据落地。

数据落地这里,首先glog 会构造不同级别的几个用于日志落地的全局对象。不同的log级别获取不同 日志落地的对象进行落地,如果是INFO级别就不会立即落地,而是缓存到这个静态对象的缓冲区中。

逻辑流

Flush-> 获取全局用于落地的对象 LogDestination -> LogToAllLogfiles -> write 落地

访问全局对象的时候加了锁,所以glog多线程下访问全局锁性能不是很高。
Flush 中会对minloglevel做判断,也就是即使当前日志级别低于minloglevel,它前面的构造这些开销也是需要的只是不会竞争锁进行数据落地。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的开源构建工具,用于管理软件构建过程中的编译、链接和安装等操作。Glog是谷歌开源的C++日志库,用于记录程序运行时的输出信息。在CMake工程中使用Glog可以通过以下几个步骤来配置和使用: 1. 在CMakeLists.txt中配置Glog:引用中的代码段展示了在CMakeLists.txt文件中配置Glog的语句。首先使用`find_package(Glog REQUIRED)`来找到Glog库,然后使用`include_directories(BEFORE ${GLOG_INCLUDE_DIRS})`将Glog库的头文件目录添加到编译器的搜索路径中。 2. 在main函数中配置Glog:引用中的代码段展示了在main函数中配置Glog的语句。首先在文件中添加`#include <glog/logging.h>`来包含Glog的头文件。然后在main函数体中使用`google::InitGoogleLogging(argv)`来初始化Glog,其中`argv`是可执行文件的名称。接下来,使用`google::SetLogDestination()`函数设置不同级别的日志信息的输出路径,可以根据需要设置不同级别的日志信息的存储路径和文件名前缀。最后,使用`LOG(INFO)`宏来输出日志信息。 3. 在其他文件中使用Glog:可以在其他文件中通过包含`<glog/logging.h>`头文件来使用Glog提供的日志功能。 综上所述,以上是在CMake工程中使用Glog的基本配置和使用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Cmake中的Glog用法浅析](https://blog.csdn.net/handsome_for_kill/article/details/69808446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值