-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
自制一个c++ log库-part3
-
支持文件固定大小
之前分析到,要支持文件固定大小,少不了要知道当前文件大小,然后和设定阈值对比,常规有以下几种方法:
- 每次写前获取文件大小信息,可能会有性能损耗
- 每次写完追加文本长度,每次启动主进程要获取一下文件大小,之后只管追加
- 记录固定行数,精度不够
- 用独立线程定时检测当前日志文件
做法1不予考虑,做法3有精度问题,做法4繁琐,还要起个线程,对比之下做法2比较合适。
1.1 声明文件大小阈值
//3M
#define MAX_LOG_SIZE 31457281.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);
}
...
}