您的位置:首页 > 其它

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

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;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: