删除指定日期前的日志文件,对大于一定内存的日志文件重命名且新建日志继续写入
2017-07-25 13:41
267 查看
在算法运行中,一般都有记录算法运行状态或者检测效果/输出特定内容的日志文件,然而算法有时可能连续运行好几百天,这样导致了日志文件越来越大,写日志所耗时也越来越大(如每次写日志时写入点位置的定位),同时也导致算法研发人员查看很不方便(打开耗时,查找定位特定问题耗时),因此有必要对日志文件进行处理,如: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;
}
当然你也可以在程序中别的方法来实现写日志功能一避开上述问题。
#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;
}
相关文章推荐
- linux删除指定日期前的日志文件中的记录
- shell字符串转日期,日期转字符串,判断字符串包含某个字符串,删除某个目录下的几天前的日志文件
- 用批处理删除N天前或指定日期时间(前后)创建(或修改)的文件
- 删除目录下指定日期之前的文件命令
- 用PowerShell删除N天前或指定日期(前后)创建(或修改)的文件
- CentOS Linux自动备份文件到远程FTP服务器并删除指定日期前的备份Shell脚本
- centos定时删除指定日期之前的文件
- 删除指定日期以前的文件
- Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本
- shell备份文件、重命名文件、删除指定文件的3个脚本分享
- python 按照日期切分大日志文件(重点)和按照指定大小切分日志文件
- 显示指定的错误页面,同时把错误信息写入系统日志文件
- python根据文件更改日期删除指定文件夹下面文件
- CentOS Linux自动备份文件到远程FTP服务器并删除指定日期前的备份Shell脚本
- 自动删除指定时间内的日志和文件shell脚本
- 自己编写的一个程序:读取XML格式的日志文件,并以一定的数据写入数据库中
- 删除指定路径下指定天数之前(以文件的修改日期为准)
- linux中删除指定日期之前的文件
- Linux 脚本删除大于指定大小的文件
- 删除指定日期以前的文件