文件轮换器






4.58/5 (14投票s)
当文件大小达到预定义的最大文件大小时,通过在文件名后附加 00、01、02、03 等来轮换文件。
引言
通常,如果任何应用程序持续地将内容记录到一个文件中,一段时间后,日志文件大小会变得非常大。 在这些大型日志文件中查看或搜索内容非常困难。 大多数时候,为了避免大型日志文件大小,我使用文件轮换策略,即一旦文件大小达到预定义的大小限制,就关闭当前日志文件并开始记录到新文件中。 这样可以保持日志文件的大小可管理。
FileRotator 类
FileRotator
是一个类,它通过在文件大小达到其预定义大小时附加 0、1、2、3 等来实现文件名轮换逻辑。 在此类的构造函数中,我们可以指定基本文件名、最大文件大小和最大文件计数。 此类可以很容易地与记录器或流数据写入器一起使用。 FileRotator
创建一个带有构造函数中提供的基本文件名的文件。 一旦该文件达到其最大大小,它会将当前文件重命名为 *myfile00.txt* 并创建一个新文件 *myfile.txt*。 同样,当新的 *myfile.txt* 达到其最大大小时,它再次将当前文件重命名为 *myfile01.txt* 并创建一个新文件 *myfile.txt*。 此过程持续到达到构造函数中定义的最大文件计数为止。 之后,它开始删除旧文件 *myfile00.txt*、*myfile01.txt*、*myfile02.txt* 等。 它始终写入 *myfile.txt*。 此类内部决定是否需要基于最大文件计数附加 1 或 01 或 001 等。
目前,旧文件删除逻辑基于文件名序列,稍后可以将其改进为基于文件创建时间。 我还使用类似的逻辑来保存来自流的数据。 我将在未来尝试使此类更通用。
Using the Code
在您现有的应用程序中使用 FileRotator
类非常简单。 您只需将 *FileRotator.cpp* 添加到您的项目中,并在您要使用此类的地方包含 *FileRotator.h*。
在您现有的记录器类中添加 FileRotator
的成员变量。 使用此类的 Open()
和 Close()
方法打开和关闭您的文件。 要在您的文件中写入内容,请使用此类的 Write()
方法。 在此类的构造函数中,指定您要轮换文件的文件名、最大文件大小(以字节为单位)和最大文件计数。 默认最大文件计数为 99。 对于保存基于流的数据,您需要在代码中进行一些更改。 也许,我可以在我的下一个版本中使其更通用。 这是一个示例 Logger
类
#include "FileRotator.h"
class MyLogger
{
public:
MyLogger() : mFileRotator(1024 /*bytes*/, "myfile.txt")
{
mFileRotator.Open();
}
~MyLogger()
{
mFileRotator.Close();
}
int Log(char *str)
{
//
// customize your log message like adding date, time, etc. here
//
string logStr = string("Info:") + str + string("\n");
return mFileRotator.Write(logStr.c_str());
}
private:
FileRotator mFileRotator;
};
使用上面的 Logger
类
int _tmain(int argc, _TCHAR* argv[])
{
MyLogger myLogger;
int i = 0;
while (i < 10000) {
myLogger.Log("Sample log text");
i++;
}
return 0;
}
历史
- 2009 年 3 月 17 日:初始版本