请问怎样正确截短日志文件?
我在linux下写了段记录日志的代码,想再加个方法,保留一定行数,去掉历史数据.
但后来发现判断行数可能会复杂,所以就变通一下用文件大小作判断.
我有两个问题:
1.这个方法执行以后没有按照我要保留的文件长度来工作,我不知道用fseek定位,再fgets文件后面的字串的方法有没有问题.
2.有没有简单快速的方法实现按行数去掉历史数据的?
谢谢!
代码如下:
//检查日志文件行数,如果超过规定的最大长度则截取最新的日志行数,去掉旧的行.
void ShrunkFile(char *FileName,long Size)
{
FILE *pFile;
long file_size=0,lPos=0;
char *Buffer;
int letter;
if (Size <=0) return ;
if (!(pFile = fopen(FileName, "r ")))
return;
//移动到文件尾
fseek(pFile,0,SEEK_END);
//得到文件长度
file_size = ftell(pFile);
printf( "filesize:%d\n ",file_size);
lPos=file_size-Size;
if (lPos <=0)
return;
//从文件首移动到要截取的位置
fseek(pFile,lPos,SEEK_SET);
//找到第一个回车符,确定下一行的首位
while ((letter = fgetc(pFile)),letter!=EOF&&letter!= '\n ')
{
lPos++;
printf( "%c ",letter);
}
lPos++;
fseek(pFile,lPos,SEEK_SET);
//分配缓冲区
Buffer = (char *) malloc(Size);
if (Buffer != NULL)
{
fgets(Buffer,Size,pFile);
fclose(pFile);
//printf(Buffer);
if (pFile=fopen(FileName, "w "))
fputs(Buffer,pFile);
}
free( Buffer);
fclose(pFile);
return ;
}
------解决方案--------------------直接有效的方法就是每天写一个文件,
如果楼主不愿这么做,“另建一个临时文件,从日志文件里读出来后再覆盖掉旧文件”是不错的选择,从速度上来说,这比楼主正在尝试的方法要快,而且简单,用命令tail就可完成了。
------解决方案--------------------有一个工具是专门完成这样工作的
logrotate,它可以按天,周,月等对日志进行卷写,也可以按大小卷写。