zoukankan      html  css  js  c++  java
  • c语言 writelog

      1 #include "..\header\stdafx.h"
    2 #include "..\header\resource.h"
    3 #include "..\header\frame.h"
    4 #include <time.h>
    5 #include <sys/stat.h>
    6 #include <sys/types.h>
    7
    8
    9
    10 /**********************************************************************
    11 * 函数名称: // Self_GetFileSize
    12 * 功能描述: // 获取文件大小
    13 * 访问的表: //
    14 * 修改的表: //
    15 * 输入参数: // char *pFilePath
    16 * 输出参数: // void
    17 * 返 回 值: // st.st_size
    18 * 其它说明: //
    19 * 修改日期 版本号 修改人 修改内容
    20 * -----------------------------------------------
    21 * 2011/08/01 V1.0 pipi XXXX
    22 ***********************************************************************/
    23 long Self_GetFileSize(char *pFilePath)
    24 {
    25
    26 struct _stat st;
    27 _stat(pFilePath, &st);
    28 return st.st_size;
    29 }
    30
    31 /**********************************************************************
    32 * 函数名称: // Bak_file
    33 * 功能描述: // 备份文件
    34 * 访问的表: //
    35 * 修改的表: //
    36 * 输入参数: // char *soureFullpath,char *bakFullpath
    37 * 输出参数: // void
    38 * 返 回 值: //
    39 * 其它说明: //
    40 * 修改日期 版本号 修改人 修改内容
    41 * -----------------------------------------------
    42 * 2011/08/01 V1.0 pipi XXXX
    43 ***********************************************************************/
    44
    45
    46 void Bak_file(const char *soureFullpath,char *bakFullpath)
    47 {
    48 char temp[256];
    49 int len=0;
    50 strcpy(temp,bakFullpath);
    51 len = strlen(bakFullpath);
    52 sprintf(temp+len,"%s %s",__DATE__,__TIMESTAMP__);
    53 strcat(temp,".bak");
    54
    55 if(!CopyFile(soureFullpath , temp, FALSE))
    56 {
    57 printf ("备份日志文件失败. Get Last Error reports %d\n", GetLastError ());
    58 }
    59
    60
    61 }
    62
    63 /**********************************************************************
    64 * 函数名称: // Delogfile_dir
    65 * 功能描述: // 按目录删除备份文件
    66 * 访问的表: //
    67 * 修改的表: //
    68 * 输入参数: // char *logfilepath
    69 * 输出参数: // void
    70 * 返 回 值: //
    71 * 其它说明: //
    72 * 修改日期 版本号 修改人 修改内容
    73 * -----------------------------------------------
    74 * 2011/08/01 V1.0 pipi XXXX
    75 ***********************************************************************/
    76
    77 void Delogfile_dir(char *logfilepath) //删除文件路径名
    78 {
    79
    80 char buf[100] = "del";
    81 int i;
    82 i = strlen(buf);
    83 i+= sprintf( buf+i," %s " ,logfilepath);
    84 i+= sprintf( buf+i," %s " , "*.bak/q");
    85
    86 system(buf);
    87 }
    88
    89
    90
    91 /**********************************************************************
    92 * 函数名称: // Delbakfile_day
    93 * 功能描述: // 按天进行备份日志文件删除
    94 * 访问的表: //
    95 * 修改的表: //
    96 * 输入参数: // char *logbakpath,struct _stat * buf,time_t tt
    97 * 输出参数: // void
    98 * 返 回 值: //
    99 * 其它说明: //
    100 * 修改日期 版本号 修改人 修改内容
    101 * -----------------------------------------------
    102 * 2002/07/19 V1.0 pipi XXXX
    103 ***********************************************************************/
    104 void Delbakfile_day(char *logbakpath,struct _stat * buf,time_t tt,int del_day)
    105 {
    106 WIN32_FIND_DATA FindFileData;
    107 int i = 0;
    108 HANDLE hFind;
    109 char temp[256];
    110 strcpy(temp,logbakpath);
    111 strcat(temp,"*.bak");
    112 hFind = FindFirstFile(temp, &FindFileData); //d:\\back\\*.bak 删除备份文件
    113
    114
    115 if (hFind == INVALID_HANDLE_VALUE)
    116 {
    117 printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
    118 }
    119
    120
    121 if (del_day <= (int)((difftime(tt,buf->st_mtime)/3600/24)))
    122 {
    123 strcpy(temp,logbakpath);
    124 strcat(temp,FindFileData.cFileName);
    125 if(!DeleteFile(temp))
    126 {
    127 perror("删除备份日志文件第一个失败");
    128 }
    129 }
    130
    131 for (i=0;i<del_day;i++)
    132 {
    133 if(FindNextFile(hFind,&FindFileData)) //查找该目录
    134 {
    135 if (del_day <= (difftime(tt,buf->st_mtime)/3600/24)) //删除修改日期为六个月以前的
    136 {
    137 strcpy(temp,logbakpath);
    138 strcat(temp,FindFileData.cFileName);
    139 if(!DeleteFile(temp))
    140 {
    141 perror("删除备份日志文件失败");
    142 }
    143 }
    144
    145 }
    146 }
    147
    148 FindClose(hFind);
    149
    150
    151 }
    152
    153 /**********************************************************************
    154 * 函数名称: // WriteLog
    155 * 功能描述: // 日志文件写入
    156 * 访问的表: //
    157 * 修改的表: //
    158 * 输入参数: // 不定
    159 * 输出参数: // void
    160 * 返 回 值: //
    161 * 其它说明: //
    162 * 修改日期 版本号 修改人 修改内容
    163 * -----------------------------------------------
    164 * 2002/07/19 V1.0 pipi XXXX
    165 ***********************************************************************/
    166
    167 void WriteLog( char *filename,int fileLine,LogFileInfo_ST *LogFileInfo,const char *fmt, ...)
    168 {
    169 WaitForSingleObject(LogFileInfo->hMutex,INFINITE);
    170
    171 struct tm *t =NULL;
    172 struct _stat file_s;
    173 char buffer[256]= "[FILE]:",temp[256] = {0};
    174 char *p = NULL;
    175 time_t tt;
    176 va_list argptr; //你的类型链表
    177 int i = 0,fh= 0, result = 0;
    178
    179 time(&tt);
    180 t=localtime(&tt); //精确到毫秒
    181 p = filename+strlen(filename)-1;
    182 while(*(--p) != PATHSeparator); //截取文件名
    183 if(NULL!=temp)
    184 {
    185 strcpy(temp, p+1);
    186 }
    187
    188 strcat(buffer,temp);
    189 i = strlen(buffer);
    190 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);
    191 i += sprintf(buffer+i," [line]: %d ",fileLine);
    192
    193
    194 if(!LogFileInfo->openlg)
    195 {
    196 LogFileInfo->openlg = fopen(LogFileInfo->LogFileName,"a+");
    197 }
    198
    199 if(NULL ==LogFileInfo->openlg) //检测文件句柄是否为NULL
    200 {
    201 WriteLog(LogPrint,G_threadlog+GetSelfThreadNo(),"ERROR:%s","无法创建日志文件,文件句柄丢失,程序终止");
    202 LogFileInfo->openlg = fopen(LogFileInfo->LogFileName,"a+");
    203 }
    204
    205
    206 fh = _fileno(LogFileInfo->openlg);
    207 result= _fstat(fh,&file_s);
    208
    209
    210 if(LogFileInfo->PeriodRecWriteCount==LogFileInfo->CheckFileHanld) //文件句柄检查放在后面
    211 {
    212 if(0==file_s.st_nlink)
    213 {
    214 WriteLog(LogPrint,G_threadlog+GetSelfThreadNo(),"ERROR:%s","检查文件句柄丢失");
    215 LogFileInfo->openlg = fopen(LogFileInfo->LogFileName,"a+");
    216 }
    217 LogFileInfo->CheckFileHanld = -1;
    218 }
    219
    220 LogFileInfo->CheckFileHanld++;
    221
    222 va_start(argptr, fmt); //初始化你的fmt链表
    223 vsprintf(buffer+i, fmt, argptr); //可选参数
    224 va_end(argptr);
    225
    226
    227 if(LogFileInfo->BakLogFileTime<= (unsigned)(difftime(tt,file_s.st_mtime)/86400)) //隔指定天数进行一次备份
    228 {
    229
    230 sprintf(temp,"[Backup]:%s %4d-%02d-%02d %02d:%02d:%02d\n",LogFileInfo->LogFileName,t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
    231 fputs(temp,LogFileInfo->openlg);
    232 fflush(stdin);
    233 //三个月创建一个文件夹创建一个文件夹,把日志备份文件分类
    234 Bak_file(LogFileInfo->LogFileName,LogFileInfo->LogFileBakPath);
    235 }
    236
    237
    238 if(LogFileInfo->BakLogFileTime<=difftime(tt,file_s.st_mtime)/3600/24/300) //300天删除一次删除备份文件
    239 {
    240 Delbakfile_day(LogFileInfo->LogFileBakPath,&file_s,tt,300);
    241 }
    242
    243
    244 if( (unsigned)file_s.st_size/1048576>=LogFileInfo->LogFileSize) //文件过大进行备份 lMB = 1024*1024B
    245 {
    246 fclose(LogFileInfo->openlg);
    247 Bak_file(LogFileInfo->LogFileName,LogFileInfo->LogFileBakPath);
    248
    249 if(!DeleteFile(LogFileInfo->LogFileName))
    250 {
    251 WriteLog(LogPrint,G_threadlog+GetSelfThreadNo(),"ERROR:%s","删除日志文件失败");
    252 }
    253 LogFileInfo->openlg = fopen(LogFileInfo->LogFileName,"a+");
    254 sprintf(temp,"[Backup]:%s %4d-%02d-%02d %02d:%02d:%02d\n",LogFileInfo->LogFileName,t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
    255 fputs(temp,LogFileInfo->openlg);
    256
    257 }
    258
    259 fputs(buffer,LogFileInfo->openlg);
    260 fputs("\n",LogFileInfo->openlg);
    261 _flushall();
    262
    263 ReleaseMutex(LogFileInfo->hMutex);
    264
    265 }
  • 相关阅读:
    day02:Activity
    day01:Android快速入门
    解读经典《C#高级编程》第七版 Page79-93.对象和类型.Chapter3
    解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3
    基于.Net进行前端开发的技术栈发展路线(一)
    解读经典《C#高级编程》第七版 Page50-68.核心C#.Chapter2
    解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2
    解读经典《C#高级编程》第七版 Page38-45.核心C#.Chapter2
    解读经典《C#高级编程》第七版 Page32-38.核心C#.Chapter2
    解读经典《C#高级编程》第七版 Page20-32.核心C#.Chapter2
  • 原文地址:https://www.cnblogs.com/pipicfan/p/2281447.html
Copyright © 2011-2022 走看看