#include "log.h" /* data: 2015-11-13 input: output: return: function: 把接收到的IPC日志缓存到队列 */ int Clog::inqueue_log(netpack_t * netpack) { time_t t; time(&t); lsg_t *lsg = (lsg_t *)malloc(sizeof(lsg_t)); char *buf=(char *)malloc(MAX_CMD_SIZE); char *tem=(char *)malloc(MAX_CMD_SIZE); bzero(buf,MAX_CMD_SIZE); bzero(tem,MAX_CMD_SIZE); //1.日志信息处理 //dbg("writing log 1:%s",buf); sprintf(tem,"%s",ctime(&t)); del_char(tem,'\n'); del_char(tem,'\r'); sprintf(buf,"%.*s,DEV_SN:[%.*s] log message:[%.*s]\n",\ strlen(tem),tem,\ DEV_ID_SIZE,netpack->netdev.dev_sn,\ netpack->datalen,netpack->data); lsg->log_msg = buf; lsg->log_type = netpack->log.type; //2.插入链表 switch(lsg->log_type) { case OK: case INIT_ERR: case RTMP_DOWN: case RTMP_UP: case RTMP_CONNECT_ERR: case RTMP_NO_CONNECT: lsg->next = NULL; if(!loglist.tail) loglist.tail = lsg; if(loglist.head) loglist.head->next = lsg; loglist.head = lsg; loglist.log_len++; break; case URL_ERROR: case NET_ERROR: case SN_ID_ERROR: lsg->next = NULL; if(!serlog_list.tail) serlog_list.tail = lsg; if(serlog_list.head) serlog_list.head->next = lsg; serlog_list.head = lsg; serlog_list.log_len++; break; default: break; } if(tem) free(tem); return 0; } /* data: 2015-11-13 input: output: return: function: 把队列里的日志写入文件 */ int Clog::write_log() { int rtmplogfd = 0; int serverlogfd = 0; lsg_t *cur_log = loglist.tail; lsg_t *cur_serverlog= serlog_list.tail; lsg_t *tem; //每次写文件前只读一次链表头长度,减少资源竞争 int glog_size = loglist.log_len; int serverlog_size = serlog_list.log_len; if((rtmplogfd=open(RTMP_LOG_FILE,O_CREAT|O_WRONLY|O_APPEND,0600))>0) { //>1 保证头和尾不重合,防止资源竞争 while(cur_log && (loglist.log_len>1)) { switch(cur_log->log_type) { case OK: case INIT_ERR: case RTMP_DOWN: case RTMP_UP: case RTMP_CONNECT_ERR: case RTMP_NO_CONNECT: write(rtmplogfd,cur_log->log_msg,strlen(cur_log->log_msg)); break; default: break; } //dbg("%s 1\n",__FUNCTION__); if(cur_log->log_msg) free(cur_log->log_msg); //dbg("%s 2\n",__FUNCTION__); if(cur_log) free(cur_log); //dbg("%s 3\n",__FUNCTION__); cur_log = cur_log->next; loglist.tail = cur_log; glog_size--; } if(rtmplogfd) close(rtmplogfd); } //平台日志直接写入 #if 0 if((serverlogfd=open(PLATFORM_LOG,O_CREAT|O_WRONLY|O_APPEND,0600))>0) { //>1 保证头和尾不重合,防止资源竞争 while(cur_serverlog && (serlog_list.log_len > 1)) { switch(cur_serverlog->log_type) { case URL_ERROR: case NET_ERROR: case SN_ID_ERROR: write(serverlogfd,cur_serverlog->log_msg,strlen(cur_serverlog->log_msg)); break; default: break; } //dbg("%s 3\n",__FUNCTION__); if(cur_serverlog->log_msg) free(cur_serverlog->log_msg); if(cur_serverlog) free(cur_serverlog); //dbg("%s 4\n",__FUNCTION__); cur_serverlog = cur_serverlog->next; serlog_list.tail = cur_serverlog; serverlog_size--; } if(serverlogfd) close(serverlogfd); } #endif return 0; } /* data: 2015-12-8 input: output: return: function: 平台日志 */ void Clog::platform_log(const char *msg) { int fd,buf_size; time_t t; char *buf=(char *)malloc(MAX_CMD_SIZE); char *tem=(char *)malloc(MAX_CMD_SIZE); bzero(buf,MAX_CMD_SIZE); bzero(tem,MAX_CMD_SIZE); time(&t); //dbg("writing log 1:%s",buf); sprintf(tem,"%s",ctime(&t)); del_char(tem,'\n'); del_char(tem,'\r'); sprintf(buf,"%.*s %s\n",strlen(tem),tem,msg); //dbg("writing platfrom log 2:%s",buf); buf_size = strlen(buf); if((fd=open(PLATFORM_LOG,O_CREAT|O_WRONLY|O_APPEND,0600))>0) { write(fd,buf,buf_size); close(fd); } if(buf) free(buf); if(buf) free(tem); }