GLOG如何清理日志

1 日志清理

其实GLOG很长时间以来都没有日志清理功能。小白对此也很震惊,还特意去查了GLOG的提交记录。代码的提交记录显示,GLOG与日志清理有关的最初代码是2019年11月1日,而这个开源项目的起始时间可以追溯到2008年。也就是说,在长达11年的时间里,这个项目都没有清理日志的功能,甚至开发团队都没有进行相关代码的开发。

所以小白也在网上查询到一些文章,专门提到针对GLOG日志库使用时,由各路好手自己开发的日志清理工具。

如果小白开始使用这个库的时候还在它缺乏如此重要功能的时间段,那大概是会放弃它的吧。不过小白在体验过当前版本(即0.6.0)中的日志清理后,仍然还是有想要吐槽的冲动。

2 GLOG对日志清理功能的描述

在GLOG的ReadMe里,对日志清理功能的描述如下:

Automatically Remove Old Logs
To enable the log cleaner:

google::EnableLogCleaner(3); // keep your logs for 3 days

And then glog will check if there are overdue logs whenever a flush is performed. In this example, any log file from your project whose last modified time is greater than 3 days will be unlink()ed.
This feature can be disabled at any time (if it has been enabled)

google::DisableLogCleaner();

这里看上去非常简单,就是启用一下google::EnableLogCleaner()函数,然后GLOG会在第一次刷新日志的时候把超期的日志清理掉,如果想禁用清理功能,就随时调用一下google::DisableLogCleaner()函数。

唔……轻松愉快?!

事实并非如此。经过小白的测试,有以下几点问题值得吐槽,至少为什么明明有坑却不讲清楚:

  • google::FlushLogFiles()前先写入内容才能清理掉日志;
  • google::FlushLogFiles()只能清理掉对应级别内的日志(而并不是如文档及代码注释所说可以清理掉该级别及以上的日志),比如google::FlushLogFiles(google::GLOG_INFO)就只能清理GLOG_INFO级别的日志。

其中第一点其实很不好:因为清理本身是一个动作,而写入是另一个动作,目前GLOG的做法是把清理这个动作绑定在写入之后进行,差评。

对于第二点,影响倒小一些:通常情况下Warning Error Fatal级别的日志比较少也比较小。但是清理功能的设计需求明明是按时间来筛选,怎么还需要按级别分别设置?

大家可能没意识到,把第一和第二点连起来看,意味着如果要删掉超期的Warning Error Fatal级别的日志,就需要到下一次写入同等级日志并刷新的时候!对于有强迫症的人来说这很难受,不太明白为什么是这样的设计思路,希望开发团队后期能做出点调整。

3 小白的示例

为了说明小白发现的两个问题,还是以上篇文章中控制小数点精度的代码为例:

#define GLOG_NO_ABBREVIATED_SEVERITIES
#include "glog/logging.h"
#include <iostream>
#include <iomanip>
#define WRITE_LOG(s) (LOG(INFO)<<s)

int main(int argc, char* argv[])
{
	FLAGS_log_dir = "../Log/";

	if (!google::IsGoogleLoggingInitialized())
	{
		google::InitGoogleLogging("Alg_Log");
	}
	
	google::EnableLogCleaner(1);

	double pi = 3.141592653;

	// Method1: C语言风格的小数点控制
	char testInfo[128];
	sprintf_s(testInfo, "pi = %.3lf", pi);

	WRITE_LOG(testInfo);        // 尝试注释掉写入动作1
	google::FlushLogFiles(google::GLOG_INFO);


	// Method2: C++语言风格的输出流小数点控制
	LOG(INFO) << std::fixed << std::setprecision(9) << "pi = " << pi;  // 尝试注释掉写入动作2
	google::FlushLogFiles(google::GLOG_INFO);

	if (google::IsGoogleLoggingInitialized())
	{
		google::ShutdownGoogleLogging();
	}

	return 0;
}

如果你和我一样,把写入的两句代码注释掉,你就会发现日志不会被清理掉。

在这里插入图片描述

如果你完整执行以上代码,你就会发现:

在这里插入图片描述

看到了吧,在没有刷新WARNING ERROR FATAL之前,就是不会清理掉这些等级的日志。

诚以为在这个方面GLOG还需要改进。不过从开发团队给GLOG赋予的版本号来看也确实远不是完全体。希望开发团队能及时发现这些不太合理的地方。

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值