Thanks to visit codestin.com
Credit goes to github.com

Skip to content

自制一个c++ log库-part3 #76

@icehoo

Description

@icehoo

自制一个c++ log库-part3

  1. 支持文件固定大小

    之前分析到,要支持文件固定大小,少不了要知道当前文件大小,然后和设定阈值对比,常规有以下几种方法:

    1. 每次写前获取文件大小信息,可能会有性能损耗
    2. 每次写完追加文本长度,每次启动主进程要获取一下文件大小,之后只管追加
    3. 记录固定行数,精度不够
    4. 用独立线程定时检测当前日志文件

    做法1不予考虑,做法3有精度问题,做法4繁琐,还要起个线程,对比之下做法2比较合适。

1.1 声明文件大小阈值

//3M
#define MAX_LOG_SIZE 3145728

1.2 声明记录当前已写大小

static UINT s_iLogSize;

1.3 初始化

static UINT initSize()
{
	SYSTEMTIME systime;
	GetLocalTime(&systime);
	char logFilaName[MAX_PATH] = { 0 };
	sprintf(logFilaName, "%s\\rtcsdk_%hu-%02hu-%02hu.log", s_RootLogFilePath, systime.wYear, systime.wMonth, systime.wDay);

	// 这是一个存储文件(夹)信息的结构体,其中有文件大小和创建时间、访问时间、修改时间等
	struct stat statbuf;

	// 提供文件名字符串,获得文件属性结构体
	stat(logFilaName, &statbuf);

	// 获取文件大小
	size_t filesize = statbuf.st_size;

	return filesize;
}

1.4 追加和超阈值处理

while (true)
	{
		...

		char* log;
		UINT size{ 0 };
		while (S_OK == s_LogBuffer->PopBuff(log, size))//clear log cache
		{
			s_iLogSize += size;
			if (s_iLogSize >= MAX_LOG_SIZE)
			{
				s_iLogSize = 0;

				fflush(pFile);
				fclose(pFile);

				char logFilaNameNew[MAX_PATH] = { 0 };
				sprintf(logFilaNameNew, "%s\\rtcsdk_%hu-%02hu-%02hu_%02hu%02hu%02hu.log", s_RootLogFilePath, systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond);
				if (rename(logFilaName, logFilaNameNew) == 0)//rename successful
				{
				}

				pFile = fopen(logFilaName, "at");
			}

			fprintf(pFile, log);
		}

		...
	}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions