writelog 日志写入函数

#define  LogPrint __FILE__,__LINE__

 

typedef struct 

{

char            LogFileBakPath[256];

char            LogFileName[256];

unsigned int    LogFileSize;            //单位M         备份格式原始文件名.XXXX-XX-XX_XX:XX:XX

unsigned int    PeriodRecWriteCount;   //检查文件锁

unsigned int    CheckFileHanld;        //标志

unsigned int    BakLogFileTime;//单位 天,0:不备份

}LogFileInfo_ST;

 

 

/**********************************************************************

* 函数名称: // Self_GetFileSize

* 功能描述: // 获取文件大小

* 访问的表: //

* 修改的表: //

* 输入参数: // char *pFilePath

* 输出参数: //  void

* 返 回 值: // st.st_size

* 其它说明: //

* 修改日期        版本号     修改人      修改内容

* -----------------------------------------------

* 2011/08/01   V1.0      XXX        XXXX

***********************************************************************/

long  Self_GetFileSize(char *pFilePath)   

{

 

struct _stat st;

_stat(pFilePath, &st);

return st.st_size;

}

 

/**********************************************************************

* 函数名称: // Bak_file

* 功能描述: // 备份文件

* 访问的表: //

* 修改的表: //

* 输入参数: // char *soureFullpath,char *bakFullpath

* 输出参数: //  void

* 返 回 值: // 

* 其它说明: //

* 修改日期        版本号     修改人      修改内容

* -----------------------------------------------

* 2011/08/01   V1.0      XXX        XXXX

***********************************************************************/

 

void Bak_file(char *soureFullpath,char *bakFullpath)

{

strcat(bakFullpath,__DATE__);

    strcat(bakFullpath,".bak");

if(!CopyFile(soureFullpath , bakFullpath, FALSE))

 perror("备份文件失败!\n");

}  

 

}

 

 

/**********************************************************************

* 函数名称: // Delogfile_dir

* 功能描述: // 按目录删除备份文件 

* 访问的表: //

* 修改的表: //

* 输入参数: //  char *logfilepath

* 输出参数: //  void

* 返 回 值: // 

* 其它说明: //

* 修改日期        版本号     修改人      修改内容

* -----------------------------------------------

* 2002/07/19   V1.0      XXX        XXXX

***********************************************************************/

 

void Delogfile_dir(char *logfilepath)   //删除文件路径名

{

 

char buf[100] = "del";

int i;

i = strlen(buf);

    i+= sprintf( buf+i," %s " ,logfilepath);

    i+= sprintf( buf+i," %s " , "*.bak/q");

    system(buf);

}

 

 

 

/**********************************************************************

* 函数名称: // Delbakfile_day

* 功能描述: // 按天进行备份日志文件删除 

* 访问的表: //

* 修改的表: //

* 输入参数: //  char *logbakpath,struct _stat * buf,time_t tt

* 输出参数: //  void

* 返 回 值: // 

* 其它说明: //

* 修改日期        版本号     修改人      修改内容

* -----------------------------------------------

* 2002/07/19   V1.0      XXX        XXXX

***********************************************************************/

void Delbakfile_day(char *logbakpath,struct _stat * buf,time_t tt)

{

WIN32_FIND_DATA FindFileData;

int i = 0;

HANDLE hFind;

char temp[256];

strcpy(temp,logbakpath);

strcat(logbakpath,"*.*");

hFind = FindFirstFile(logbakpath, &FindFileData); //d:\\back\\*.bak   删除备份文件

strcpy(logbakpath,temp);

if (hFind == INVALID_HANDLE_VALUE)

{

printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());

 

for (i=0;i<300;i++)                       

{

if(FindNextFile(hFind,&FindFileData))      //查找该目录

{

 

if (6==(difftime(tt,buf->st_mtime)/21600))  //六个月删除一次

{  

strcpy(temp,logbakpath);

strcat(temp,FindFileData.cFileName);

if(!DeleteFile(temp))

{

perror("删除备份日志文件失败");

}

 

}

}

 

FindClose(hFind);

 

 

}

 

/**********************************************************************

* 函数名称: // WriteLog

* 功能描述: // 日志文件写入

* 访问的表: //

* 修改的表: //

* 输入参数: //  不定

* 输出参数: //  void

* 返 回 值: // 

* 其它说明: //

* 修改日期        版本号     修改人      修改内容

* -----------------------------------------------

* 2002/07/19   V1.0      XXXX        XXXX

***********************************************************************/

 本文来自博客http://hi.baidu.com/6520874qqq/blog,转载请标明出处,谢谢!

void  WriteLog( char *filename,int fileLine,LogFileInfo_ST *LogFileInfo,const char *fmt, ...) 

{

int TakesizeMB = 1048576;                                     // lMB = 1024*1024B

    static  FILE * openlog;

static unsigned cout;

struct tm *t =NULL;

struct _stat  file_s;

char buffer[256]= {0};

char *p = NULL;

time_t tt;

va_list argptr;                                               //你的类型链表 

int i = 0,j = 0, fh= 0, result = 0;

 

time(&tt);

t=localtime(&tt);

    p = filename+strlen(filename)-1;    

    while(*(--p) != '\\');              //截取文件名

if(buffer!=NULL)

{

strcpy(buffer, p+1);

}

 

i = strlen(buffer);

i += sprintf(buffer+i," %4d-%02d-%02d %02d:%02d:%02d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);

    i += sprintf(buffer+i," [line]: %d ",fileLine);

 

strcpy(LogFileInfo->LogFileName,"frame.log");

if(!openlog)

{

openlog = fopen(LogFileInfo->LogFileName,"a+");  

}

 

if(NULL ==openlog)                                       //检测文件句柄是否为NULL

{

MessageBox(NULL, "无法创建日志文件,文件句柄丢失,程序终止", "ERROR",MB_OK);

exit(!0);

}

 

 

fh = _fileno(openlog); 

result= _fstat(fh,&file_s);

 

if(LogFileInfo->PeriodRecWriteCount==cout)                   //文件句柄检查

{

if(0==file_s.st_nlink)             

perror("文件句柄丢失");

exit(!0);

}

}

    cout++;

   va_start(argptr, fmt);                                                        //初始化你的fmt链表

    vsprintf(buffer+i, fmt, argptr);                                              //可选参数

va_end(argptr); 

 

 

if(LogFileInfo->BakLogFileTime<=difftime(tt,file_s.st_mtime )/86400)          //隔指定BakLogFileTime天备份一次

{

//只读情况的出现?

 

sprintf(buffer," [Backup]:%s %4d-%02d-%02d %02d:%02d:%02d",LogFileInfo->LogFileName,t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);

fputs(buffer,openlog);

fflush(stdin);

Bak_file(LogFileInfo->LogFileName,LogFileInfo->LogFileBakPath);

}

 

 

if(LogFileInfo->BakLogFileTime<=difftime(tt,file_s.st_mtime)/3600/24/300)  //300天删除一次删除备份文件

{

      Delbakfile_day(LogFileInfo->LogFileBakPath,&file_s,tt);

}

 

if(file_s.st_size/(unsigned)TakesizeMB>=LogFileInfo->LogFileSize)      //文件过大进行备份

{  

 

printf("开始备份日志文件");

Bak_file(LogFileInfo->LogFileName,LogFileInfo->LogFileBakPath);

fclose(openlog);

 

if(!DeleteFile(LogFileInfo->LogFileName))

{   

perror("删除日志文件失败");

}

 

fopen(LogFileInfo->LogFileName,"a+"); 

sprintf(buffer," [Backup]:%s %4d-%02d-%02d %02d:%02d:%02d",LogFileInfo->LogFileName,t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);

fputs(buffer,openlog);

fflush(stdin);

 

}

Delogfile_dir(LogFileInfo->LogFileBakPath);

fputs(buffer,openlog);

fputs("\n",openlog);

fflush(stdin);

}

 

 

int main(void) 

    LogFileInfo_ST  info;

//日志文件名全部

strcpy(info.LogFileBakPath,"d:\\back\\");//指定一个备份目录

info.LogFileSize = 2;                                           //单位m

info.BakLogFileTime = 1;

info.PeriodRecWriteCount = 5;

 

WriteLog(LogPrint,&info,"%可选参数1%s","XXX");

 

return 0; 

}

转载于:https://www.cnblogs.com/yyhxqx/p/4792287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值