基于c++的日志文件实现

所有的商业软件或线上系统都具有日志功能,因为日志信息提供了系统启动以来的重要的操作或状态迁移记录,是追踪各种异常错误的第一手资料。绝大部分系统的日志模块会自动保留历史日志文件,即:日志文件大小达到约定上限时,自动转储到一个新的日志历史文件,当前文件清空并继续记录新的日志信息,例如:假设当前日志文件名为test.log, 当它的大小到达上限(例如10MB)时,就把其文件内容转储到新文件test.log.1, 然后test.log清空并继续记录新信息。根据配置不同,我们可以保留1到N份历史日志文件。当历史日志文件数目达到上限时,我们可以采用round-robin策略(或其他策略)依据文件生成时间依次覆盖老的文件。本文尝试用C++实现上述日志文件功能,其功能归纳总结如下:

1) 日志文件提供接口让用户配置日志文件名、日志大小上限、历史日志文件数目上限;

2) 日志文件提供Append()接口,让用户向文件追加日志消息;

3) 日志文件在执行Append()接口过程中,自动检测当前日志文件大小:如果追加当前消息后,文件大小超过约定上限,则记录当前消息前,将已有消息转储到历史文件并保证历史日志文件数不超过约定上限;否者,直接记录当前消息;

4) 日志文件提供接口让用户配置是否对历史日志文件进行压缩;

LogFile类实现了上述功能,先看一下其接口定义:

 1 #ifndef _LOGFILE_H
 2 #define _LOGFILE_H
 3 
 4 #include <fstream>
 5 #include <iostream>
 6 
 7 
 8 class LogFile {
 9 public:
10     LogFile(const LogFile &) = delete;
11     LogFile& operator=(const LogFile &) = delete;
12     LogFile(const std::string&, double, unsigned int);
13 
14     ~LogFile();
15     void Append(std::string &&msg);
16 
17 private:
18     void Rotate();
19     double GetFileSize();
20     std::string NextHistoryFile();
21 
22 private:
23     std::ofstream ofs_;
24     std::string file_name_;
25     double cur_size_;
26     double max_size_;
27     unsigned int max_file_num_;
28 };
29 
30 #endif //_ROTATEFILE_H

LogFile成员变量说明:

ofs_: c++ std::ofstream类型对象,通过其操作符"<<"把消息写入日志文件

file_name_: 日志文件名;

cur_size_: 实时记录当前日志文件大小,避免每次执行Append()操作时调用系统函数获取文件大小;

max_size_: 用户指定的日志文件上限;

max_file_num_: 用户指定的最大历史文件数;

LogFile成员函数说明:

LogFile(const std::string&, double, unsigned int): LogFile类的唯一构造函数,可以指定日志文件名,文件大小上限,历史文件数量上限,其实现也非常简单:

 

猜你喜欢

转载自www.cnblogs.com/wangwenzhi2019/p/11100331.html
今日推荐