一个奇怪的问题
我写了一个程序,运行在许多不同的机器,
有windows XP和windows 2000
共一百多台机器,
是mon_log、dlog、wlog是程序里记录日志的函数。
目前的问题:间或有几台机器,日志文件出现大量乱码,程序崩溃。
好像访问了非法内存了或者内存溢出死掉了。
代码如下:
static int adjust_log(FILE *fp, char *logname)
{
char name[256];
char next[256]; //for example: name="mon2.log", so next="mon3.log"
int i;
#define GET_LOGNAME(name, num) sprintf(name, "%s.%d", logname, num)
GET_LOGNAME(name, LOG_FILE_NUM-1);
if(access(name, 0) == 0) {
GET_LOGNAME(name, LOG_FILE_NUM);
remove(name);
}
for(i = LOG_FILE_NUM-1; i > 0; i--) {
GET_LOGNAME(name, i);
if(access(name, 0) == 0) {
GET_LOGNAME(next, i+1);
rename(name, next);
}
}
GET_LOGNAME(next, 1);
CopyFile(LOG_FILE, next, FALSE);
chsize(fileno(fp), 0);
return 0;
}
#define MAX_LINE_SIZE 512
void write_log(FILE *fp, char *name, int type, char *msg)
{
time_t ltime;
struct tm *today;
#define TIME_STR_SIZE 64
char date_str[TIME_STR_SIZE] = {0};
char time_str[TIME_STR_SIZE] = {0};
int size;
char *typestr;
int rc;
time(<ime);
today = localtime(<ime);
switch(type) {
case INFO_TYPE:
typestr = "INF";
break;
case WARNING_TYPE:
typestr = "WAR";
break;
case ERROR_TYPE:
typestr = "ERR";
break;
case FATAL_TYPE:
typestr = "FAT";
break;
default:
return;
}
if (fp != NULL)
{
size = filelength(fileno(fp));
/* 文件大小超过10M,清空重新开始 */
if(size > LOG_FILE_MAX_SIZE) {
adjust_log(fp, name);
}
if (today != NULL) {
rc = sprintf(date_str,"%04d/%02d/%02d",today->tm_year+1900,today->tm_mon+1,today->tm_mday);
sprintf(time_str,"%02d:%02d:%02d",today->tm_hour,today->tm_min,today->tm_sec);
}
date_str[TIME_STR_SIZE - 1] = '\0';
time_str[TIME_STR_SIZE - 1] = '\0';
fprintf(fp, "%s %s(%s): ", date_str, time_str, typestr);
fprintf(fp, "%s", msg);
fprintf(fp,"\n");
fflush(fp);
}
return;
}
void dlog(int type, const char *format, ...)
{
va_list ap;
FILE *fp;
char msg[MAX_LINE_SIZE];
fp = fopen(LOG_FILE, "a+");
if(NULL == fp) {
return;
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, LOG_FILE, type, msg);
fclose(fp);
return;
}
void wlog(char *name, int type, const char *format, ...)
{
va_list ap;
FILE *fp;
char msg[MAX_LINE_SIZE];
fp = fopen(name, "a+");
if (NULL == fp) {
return;
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, name, type, msg);
fclose(fp);
return;
}
void mon_log (int type, const char *format, ...)
{
va_list ap;
static FILE *fp;
static HANDLE hMutex;
char msg[MAX_LINE_SIZE];
if(hMutex == NULL) {
hMutex = CreateMutex(NULL, FALSE, NULL);
if (hMutex == NULL) {
printf("CreateMutex error: %d\n", GetLastError());
return;
}
}
WaitForSingleObject(hMutex, INFINITE);
if(NULL == fp) {
fp = fopen(LOG_FILE, "a+");
}
va_start(ap, format);
_vsnprintf(msg, sizeof(msg)-1, format, ap);
msg[MAX_LINE_SIZE-1] = '\0';
va_end(ap);
write_log(fp, LOG_FILE, type, msg);
ReleaseMutex(hMutex);
return;
}