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 }
我自豪 我是一名软件工程师。