当前位置: 首页 > 科技观察

Shell脚本实战:日志关键字监控+自动告警

时间:2023-03-12 11:01:09 科技观察

本程序使用场景说明:主要用于Linux服务器监控程序日志,如果关键字异常,会触发相应的动作或告警操作,并通知电子邮件联系人。一、安装邮件服务1、解压tar-jxfmailx-12.4.tar.bz2-C/usr/src/&&cd/usr/src/mailx-12.4/2。编译makeinstallUCBINSTALL=/usr/bin/install编译异常-1异常错误解决方法下载mailx补丁文件“mailx-12.4-openssl_1.0.0_build_fix-1.patch”,将补丁文件和mailx解压目录放在同一路径并执行补丁命令:patch-p0$chkfilefi#generatelogfunctiondo_writelog(){case$1ini|I)shiftcho"$(date+%Y-%m-%d)$(date+%H:%M:%S)|INFO|$@">>$logfile;;e|E)shiftecho"$(date+%Y-%m-%d)$(date+%H:%M:%S)|ERROR|$@">>$logfile;;w|W)shiftecho"$(date+%Y-%m-%d)$(date+%H:%M:%S)|警告|$@">>$logfile;;*)echo"$(date+%Y-%m-%d)$(date+%H:%M:%S)|DEBUG|$@">>$logfileesac}#日志处理部分代码cat$chkfile|egrep-v"^($|#)"|whilereadi;do(app_name=$(echo"$i"|awk-F,'{print$1}')iftest-z"$app_name";thendo_writeoge"应用名称为空,退出并执行"exit0filog_filename=$(echo"$i"|awk-F,'{print$2}')iftest!-e"$log_filename";thendo_writeloge"日志文件($log_filename)不存在,退出执行"exit0filog_md5sum=$(echo-n"$log_filename"|md5sum|awk'{print$1}')log_gjz=$(echo"$i"|awk-F,'{print$3}')iftest-z"$log_gjz";thendo_writelogi"日志文件($log_filename),关键字为空,退出执行"exit0filog_retry=$(echo"$i"|awk-F,'{print$4}')expr$log_retry+0&>/dev/nullif[$?-ne0];thenlog_retry=0filog_max=$(echo"$i"|awk-F,'{print$5}')expr$log_max+0&>/dev/nullif[$?-ne0];thenlog_max=3fistart_command=$(echo"$i"|awk-F,'{print$6}')stops_command=$(echo"$i"|awk-F,'{print$7}')open_sendmail=$(echo"$i"|awk-F,'{print$8}')mail_scripts=$(echo"$i"|awk-F,'{print$9}')mail_contacts=$(echo"$i"|awk-F,'{print$10}')if[$open_sendmail-eq1];theniftest-z"$mail_scripts";thendo_writelogi"App($app_name),触发动作脚本为空,退出并执行"exit0fiiftest-z"$mail_contacts";然后do_writelogi"application($app_name),联系人为空,退出执行"exit0fifiiftest!-e"$tmpsdir/$log_md5sum";然后log_new_count=$(wc-l$log_filename|awk'{print$1}')echo"$log_new_count">$tmpsdir/$log_md5sumdo_writelogi"logfile($log_filename),初始化读取日志行数:$log_new_count,退出执行"elselog_old_count=$(cat$tmpsdir/$log_md5sum)expr$log_old_count+0&>/dev/nullif[$?-ne0];thendo_writeloge"log文件($log_filename),读取历史行数失败,退出执行"exit0filog_new_count=$(wc-l$log_filename|awk'{print$1}')if[$log_new_count-eq$log_old_count];thendo_writelogi"日志文件($log_filename),没有更新,退出并执行“exit0elif[$log_new_count-lt$log_old_count];thendo_writelogi”日志文件($log_filename),更新跨天的日志行数:$log_new_count,退出并执行“echo”"$log_new_count">$tmpsdir/$log_md5sumelselog_upd_count=$(expr$log_new_count-$log_old_count)do_writelogi"日志文件($log_filename),历史行号:$log_old_count,最新linenumber:$log_new_count,updatelinenumber:$log_upd_count"#读取更新日志log_content=$(tail-n+`expr$log_old_count+1`$log_filename|head-n+$log_upd_count)oldIFS=$IFSIFS="|"count=0foriin$log_gjz;doif[$(echo"$log_content"|grep-c-w"$i")-ge1];thenletcount+=1fiif[$count-gt0];thenbreakfidoneIFS=$oldIFSif[$count-gt0];thenecho"0">>$tmpsdir/${log_md5sum}.retryelsedo_writelogi"日志文件($log_filename),没有获取关键字,退出执行"echo"$log_new_count">$tmpsdir/$log_md5sumexit0fiif[[$(wc-l$tmpsdir/${log_md5sum}.retry|awk'{print$1}')-gt$log_retry]];thenecho"0">>$tmpsdir/${log_md5sum}_$(date+%F)if[$(wc-l$tmpsdir/${log_md5sum}_$(date+%F)|awk'{print$1}')-le$log_max];则$stops_command1>>$logfile2>&1$start_command1>>$logfile2>&1do_writelogi"日志文件($log_filename),日志内容:$log_content,查找关键字:$i,停止命令:$stops_command,启动命令:$start_command,重启服务"if[$open_sendmail-eq1];theniftest-n"$mail_scripts";然后$mail_scripts"application[$app_name]failure""日志文件($log_filename),日志内容:$log_content,查找关键字:$i""$mail_contacts";1>>$logfile2>&1if[$?-ne0];thendo_writelogi"日志文件($log_filename),日志内容:$log_content,找到关键字:$i,触发报警失败"fido_writelogi"日志文件($log_filename),Log内容:$log_content,找到关键字:$i,警报通知联系人:[$mail_contacts]“fielsedo_writelogi”日志文件($log_filename),日志内容:$log_content,找到关键字:$i,未触发警报“fielsedo_writelogi”日志文件($log_filename),日志内容:$log_content,发现关键字:$i,重启服务超过每日限制次数:$log_max,退出执行"firm-f$tmpsdir/${log_md5sum}.retry&>/dev/nullelsedo_writelogi"日志文件($log_filename),日志内容:$log_content,找到关键字:$i,重试检测:$(wc-l$tmpsdir/${log_md5sum}.retry|awk'{print$1}')"fiecho"$log_new_count">$tmpsdir/$log_md5sumdo_writelogi"日志文件($log_filename),更新记录文件完成"fifi)&done