在算法运行中,一般都有记录算法运行状态或者检测效果/输出特定内容的日志文件,然而算法有时可能连续运行好几百天,这样导致了日志文件越来越大,写日志所耗时也越来越大(如每次写日志时写入点位置的定位),同时也导致算法研发人员查看很不方便(打开耗时,查找定位特定问题耗时),因此有必要对日志文件进行处理,如:A、删除N天以前的日志文件;B、对内存超过指定大小的且正在写入日志内容的日志文件进行重命名;C、及时新建日志文件方便程序继续写日志。以下代码就实现了以上三个功能。
当然你也可以在程序中别的方法来实现写日志功能一避开上述问题。
#include <stdio.h>
#include "Windows.h"#include <io.h>
#include <time.h>
//************************************
// Method: deleteLog delete old files and big_size files
// FullName: CPeopleEstimating::deleteLog
// Access: public
// Returns: int
// Qualifier:
// Parameter: string filePath 文件路径 es:"D:\\alglog\\"
// Parameter: long int dayTH how many days before
// Parameter: long int fileSizeTh size:Mb,can modified by Kb
//************************************
int CPeopleEstimating::delete-reName-newbuid-log( string filePath,long int dayTH,long int fileSizeTh)
{
/*SYSTEMTIME time;
GetLocalTime(&time);
long int log_year=time.wYear;
long int log_month = time.wMonth;
long int log_day = time.wDay;
int now_days=(log_year-1970)*365 + log_month*30 + log_day;//有误差,每个月的天数不一样,精确的话可以精细化计算。
*/
time_t temp=time(NULL);
long int getSysTime=temp;
//string filePath="D:\\alglog\\";
long hFile = 0;
struct _finddata_t fileInfo;
string pathName,readFileName,goalFileName,deleteFileName="";
int len=0,pos=0,testNum=0;;
long int intervalDays;
if ((hFile = _findfirst(pathName.assign(filePath).append("\\*").c_str(), &fileInfo)) == -1)
{
cout<<"/**********找不到文件目录*********/"<<endl;
return -1;
}
do
{
readFileName="";
goalFileName="";
readFileName=fileInfo.name;
if(readFileName.length()>4 && readFileName.compare(0,1,".")!=0)
{
deleteFileName= filePath + readFileName;
intervalDays=0;
len=0,pos=0;
pos=readFileName.find_last_of(".");
len=readFileName.length();
goalFileName=readFileName.substr(pos+1,len);
if(goalFileName.compare("log")==0) //只删除log格式的文件,删除txt格式的请改为 "txt"
{
long int time00=fileInfo.time_create;
intervalDays=1+ abs(getSysTime-time00)/(3600*24);
//if(intervalDays >= dayTH)
//DeleteFile(deleteFileName.c_str()); //删除log文件 仅支持多字节字符集
/*************************************************/ //支持uncode
size_t stringLen=deleteFileName.length()+1;
size_t lpcwstrChars=0;
wchar_t *wcString =(wchar_t *)malloc(sizeof(wchar_t)*(deleteFileName.length()-1));
mbstowcs_s(&lpcwstrChars, wcString, stringLen, deleteFileName.c_str(), _TRUNCATE);
if(intervalDays >= dayTH)
DeleteFile(wcString);
else
{
long int fileSize=fileInfo.size; //文件大小
fileSize /=1024*1024;
if(fileSize>fileSizeTh)
{
// DeleteFile(wcString); 删除,注释该语句更好
//为防止日志名重复(如凌晨间的的日志,到下午5点其大小就大于fileSizeTh),因此新建后的日志名需要改,日志名=PeopleEstimating(PeopleEstimating_new)+日期
const wstring logFileName_con = L"D://alglog//PeopleEstimating_new";
CDbgPrintModule logForPeopleEstimating(moduleName, logFileName_con);//错误日志
}
}
/**********************************/
}
}
}while (_findnext(hFile, &fileInfo) == 0);
_findclose(hFile);
return 1;
}