- 论坛徽章:
- 0
|
最近写的一个程序自从添加了以文件大小来自动生成新的日志文件大小就问题频发;
程序主要设计是这样的:
将接收到的请求消息,与要发送的回复消息通通COPY一份push到日志队列,然后再由日志线程进行全部信息的日志输出;
后来添加了以文件大小来自动生成新的日志文件后(红色部分)在高负荷运作测试下就出现如下问题:
1.不定时的内存错误;(这个让人头疼,服务程序直接挂掉)(有时候处理几万条消息,都没问题,有时候处理几百条就出错);
2.日志信息有丢失现象,就是两个相邻生成的日志文件存在丢失日志信息的现象,一丢就丢几百条;
3.生成的日志文件中存在大小为0的文件;
注:在未添加这个红色代码时,一切正常;
//从日志队列中取值,并输出日志
void LogEventsFunc( FILE *stream)
{
MGCMessageHead *LogEventsBuffer;
LogEventsBuffer=LogQueueCache.front();
int msgCount=0;
OTSGETAVAIBLEMONEYREQ MoneyReq;
OTSGETAVAIBLEMONEYRSP MoneyRsp;
OTSSENDCDRREQ CdrReq;
OTSSENDCDRRSP CdrRsp;
time_t rawtime;
struct tm*timeinfo;
rawtime=time(NULL);
timeinfo=localtime(&rawtime);
long long size;
size=ftell(stream);
if(size>DEFAULT_MAX_LOG_SIZE)
{
sprintf(log_file_name,"packet_log%d%d%d%d%d%d",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
fflush(stream);
fclose(stream);
stream=NULL;
stream=fopen(log_file_name,"a+");
}
if(!stream) return;
//根据新的消息类型进行错误定义与判断
int Type=LogEventsBuffer->get_bodyid();
#if 1
switch(Type)
{
//日志处理主要使用fprintf()
case 22:
.......
default:
fprintf(stream,"%s\n\t ERRORMESSAGE:未识别的错误信息!\n",asctime(timeinfo));
break;
}
#endif
delete LogEventsBuffer;
LogEventsBuffer=NULL;
LogQueueCache.pop();
}
//日志记录线程主函数
void *LogEventsThreadFunc(void *)
{
printf("LogEventsThreadFunc\n");
time_t rawtime;
struct tm*timeinfo;
rawtime=time(NULL);
timeinfo=localtime(&rawtime);
FILE *stream;
stream = fopen( log_file_name, "w" );
bool LogIsEmpty;
//处理日志记录过程
while(1)
{
pthread_mutex_lock(&log_mut);
LogIsEmpty=LogQueueCache.empty();
if (LogIsEmpty)
{ while(1)
{
pthread_cond_wait(&log_cond, &log_mut);
if(LogIsEmpty) break;
}
}
LogEventsFunc(stream);
pthread_mutex_unlock(&log_mut);
}
fclose(stream);
char *EXIT="LogEventsThread Exit!";
pthread_exit(EXIT);
} |
|