nagios插件之监控Asterisk日志文件--messages

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

vi check_ast_msg_log.c

#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);
}

你可能感兴趣的:(nagios插件之监控Asterisk日志文件--messages)