删除指定日期前的日志文件,对大于一定内存的日志文件重命名且新建日志继续写入

         在算法运行中,一般都有记录算法运行状态或者检测效果/输出特定内容的日志文件,然而算法有时可能连续运行好几百天,这样导致了日志文件越来越大,写日志所耗时也越来越大(如每次写日志时写入点位置的定位),同时也导致算法研发人员查看很不方便(打开耗时,查找定位特定问题耗时),因此有必要对日志文件进行处理,如: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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值