65.9K
CodeProject 正在变化。 阅读更多。
Home

文件轮换器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (14投票s)

2009年3月17日

CPOL

2分钟阅读

viewsIcon

44085

downloadIcon

1961

当文件大小达到预定义的最大文件大小时,通过在文件名后附加 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 日:初始版本
© . All rights reserved.