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;
}