监控Asterisk日志文件messages,过滤“ERROR”和"WARNING"字符串,统计包含该字符串的行数


vi check_ast_msg_log.c


[cpp] view plaincopy

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>


#define OK 0

#define WARNING 1

#define CRITICAL 2

#define UNKNOWN 3


#define LEN 1024


#define LOG_FILE "/home/weihu/check_log/ast_messages/messages"


#define OLD_FILE_ERROR "/home/weihu/check_log/ast_messages/log_tmp_error.file"


#define OLD_FILE_WARNING "/home/weihu/check_log/ast_messages/log_tmp_warning.file"


char error_str_now_failed[LEN]={0};

char error_str_old_failed[LEN]={0};


char warning_str_now_failed[LEN]={0};

char warning_str_old_failed[LEN]={0};



char month_day[32];


int all_line=0;

int err_line=0;


int error_mark=0;

int error_line=0;

int error_count=0;


int warning_mark=0;

int warning_line=0;

int warning_count=0;


int check_old_file(void) {

int ret;

FILE *fp_old;

char readbuf[1024];


fp_old=fopen(OLD_FILE_ERROR,"a+");

if(fp_old==NULL) {

fprintf(stderr,"check_old_file() is fopen() error.\n");

return -1;

}


ret=fseek(fp_old,0,SEEK_SET);

if(ret==-1) {

fprintf(stderr,"check_old_file() is fseek() error.\n");

return -1;

}


/*

while(fgets(readbuf,1024,fp_old)!=NULL) {

strcat(error_str_old_failed,readbuf);

}

*/


fgets(error_str_old_failed,1024,fp_old);


ret=fclose(fp_old);

if(ret==EOF) {

fprintf(stderr,"check_old_file() is fclose() error.\n");

return -1;

}


// printf("%s",error_str_old);

// printf("-------------------------\n");

//

//----------------------------------------------------------------------

fp_old=fopen(OLD_FILE_WARNING,"a+");

if(fp_old==NULL) {

fprintf(stderr,"check_old_file() is fopen() error.\n");

return -1;

}


ret=fseek(fp_old,0,SEEK_SET);

if(ret==-1) {

fprintf(stderr,"check_old_file() is fseek() error.\n");

return -1;

}


/*

while(fgets(readbuf,1024,fp_old)!=NULL) {

strcat(error_str_old_failed,readbuf);

}

*/


fgets(warning_str_old_failed,1024,fp_old);


ret=fclose(fp_old);

if(ret==EOF) {

fprintf(stderr,"check_old_file() is fclose() error.\n");

return -1;

}


// printf("%s",error_str_old);

// printf("-------------------------\n");


return 0;

}


int write_old_file(char *old_file,char *error_str) {

int ret;

FILE *fp_old;


fp_old=fopen(old_file,"w");

if(fp_old==NULL) {

fprintf(stderr,"write_old_file() is fopen() error.\n");

}


ret=fprintf(fp_old,"%s",error_str);

if(ret<0) {

fprintf(stderr,"write_old_file() if fprintf() fp_old error.\n");

return -1;

}


ret=fclose(fp_old);

if(ret==EOF) {

fprintf(stderr,"write_old_file() is fclose() error.\n");

}


return 0;

}


int parse_log_file(char *log_file) {

FILE *fp;

long int *position;

char readbuf[1024];

char readbuf_tmp[1024];

int size=1024,line=0,line_bak;

char *str;


int ret;


int mark;

char *p,*str_date;


position=(long int *)malloc(sizeof(long int)*size);

position[0]=0;


fp=fopen(log_file,"r");

if(fp==NULL) {

// fprintf(stderr,"parse_log_file() is fopen() error %s\n",log_file);

perror("parse_log_file() is fopen() error,");

exit(-1);

}


while(fgets(readbuf,sizeof(readbuf),fp)!=NULL) {

if(++line==size) {

size*=2;

position=(long int *)realloc(position,sizeof(long int)*size);

}


position[line]=ftell(fp);

}


all_line=line;

line_bak=line;


while(line--) {

mark=0;


ret=fseek(fp,position[line],SEEK_SET);

if(ret==-1) {

perror("parse_log_file() is fseek()");

return -1;

}


str=fgets(readbuf,sizeof(readbuf),fp);

if(str==NULL) {

fprintf(stderr,"parse_log_file() is fgets() error.\n");

return -1;

}


// strcpy(readbuf_tmp,readbuf);

// strtok


if(strstr(readbuf,month_day)>0 && line!=1) {

// printf("-----------------\n");


if(strstr(readbuf,"ERROR") && strstr(readbuf,"5060: Connection refused") && error_mark==0) {

// if(strstr(readbuf,"ERROR") && error_mark==0) {

// printf("++++++++++++++++++++++++++++++++\nn");

// if(strstr(readbuf,"FAILED")) {

if(strcmp(error_str_old_failed,readbuf)) {

error_line=line+1;

error_count++;


// strcat(error_str,readbuf);

// printf("readbuf=%s\n",readbuf);

strcpy(error_str_now_failed,readbuf);

// printf("error_str_now_failed=%s\n",error_str_now_failed);


if(error_count==1) {

ret=write_old_file(OLD_FILE_ERROR,error_str_now_failed);

if(ret==-1) {

fprintf(stderr,"parse_log_file() is write_old_file() error_str_now_failed error.\n");

return -1;

}

}


}

else {

error_mark=1;

}


}

// printf("error_count=%d\n",error_count);

}


//----------------------------------------------------------------------------------------------------

//

if(strstr(readbuf,month_day)>0 && line!=1) {

// printf("-----------------\n");


if(strstr(readbuf,"WARNING") && strstr(readbuf,"sip") && error_mark==0) {

// if(strstr(readbuf,"WARNING") && warning_mark==0) {

// printf("++++++++++++++++++++++++++++++++\nn");

// if(strstr(readbuf,"FAILED")) {

if(strcmp(warning_str_old_failed,readbuf)) {

warning_line=line+1;

warning_count++;


// strcat(error_str,readbuf);

// printf("readbuf=%s\n",readbuf);

strcpy(warning_str_now_failed,readbuf);

// printf("error_str_now_failed=%s\n",error_str_now_failed);


if(warning_count==1) {

ret=write_old_file(OLD_FILE_WARNING,warning_str_now_failed);

if(ret==-1) {

fprintf(stderr,"parse_log_file() is write_old_file() warning_str_now_failed error.\n");

return -1;

}

}


}

else {

warning_mark=1;

}


}

// printf("warning_count=%d\n",warning_count);

}

}


// printf("error_count=%d,error_str_now_failed=%s\n",error_count,error_str_now_failed);

// printf("warning_count=%d,warning_str_now_failed=%s\n",warning_count,warning_str_now_failed);


ret=fclose(fp);

if(ret==EOF) {

fprintf(stderr,"parse_log_file() is fclose() error\n");

}


return 0;

}



int main(void) {

int fd,ret;

int mark=0;


char if8_log_file[128];


char send_mail_cmd[LEN];


char nowtime[128];

char hostname[128];


int exitstatus=OK;

char *exit_status[4]={"OK","WARNING","CRITICAL","UNKNOWN"};


char status_information[LEN];

char performance_data[LEN];


char my_day[32];

char my_week[32];

char my_month[32];

char my_year[32];


char *week[]={"Sat","Sun","Mon","Tue","Wed","Thu","Fri"};

char *month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};


time_t timestamp;

struct tm *p1;


timestamp=time(NULL);

p1=localtime(×tamp);


// sprintf(my_day,"%02d",p1->tm_mday);

sprintf(my_day,"%d",p1->tm_mday);

sprintf(my_week,"%s",week[p1->tm_wday]);

sprintf(my_month,"%s",month[p1->tm_mon]);

sprintf(my_year,"%d",1900+p1->tm_year);


// printf("day=%s,week=%s,month=%s,year=%s\n",my_day,my_week,my_month,my_year);


sprintf(month_day,"%s %d",month[p1->tm_mon],p1->tm_mday);


// printf("%s\n",month_day);


// sprintf(today_start_time,"%d-%02d-%02d %s\n",p1->tm_year+1900,p1->tm_mon+1,p1->tm_mday,"16-00-00");

// printf("today_start_time=%s\n",today_start_time);


ret=gethostname(hostname,sizeof(hostname));

if(ret==-1) {

fprintf(stderr,"gethostname() error.\n");

exit(-1);

}


ret=check_old_file();

if(ret==-1) {

fprintf(stderr,"check_old_file() error.\n");

exit(-1);

}

// printf("error_str_old_failed=%s\n",error_str_old_failed);

// printf("error_str_old_no_answer=%s\n",error_str_old_no_answer);


ret=parse_log_file(LOG_FILE);

if(ret==-1) {

fprintf(stderr,"parse_log_file() error.\n");

exit(-1);

}


// printf("%s\n",nowtime);

// printf("hostname=%s\n",hostname);


// printf("failed_err_line=%d\n",failed_err_line);

// printf("no_answer_err_line=%d\n",no_answer_err_line);


// printf("all_line=%d\n",all_line);



// printf("-------------------------------\n");


if(error_count>0 || warning_count>0 ) {

exitstatus=CRITICAL;

}


/*

else if(error_count>1 || warning_count>5) {

exitstatus=CRITICAL;

}

*/


sprintf(status_information,"Current Error_num=%d, Warning_num=%d",error_count,warning_count);


sprintf(performance_data,"Error_num=%d;;;; Warning_num=%d;;;;",error_count,warning_count);


printf("%s: %s | %s\n",exit_status[exitstatus],status_information,performance_data);


exit(0);

}