日志监控:
某模块输出日志格式如下
192.168.1.1 [2010 08:03 11:07:16] * a=(a,x,a) b=(b,b,y) c=(z,c,c)
其中x,y,z的值输出范围为0~9,当且仅当x=3,y=5,z=1的时候我们认为该条日志不符合预期
要求对该模块的日志作监控,需要满足如下条件:
1、在每天10:00~22:00期间,监控粒度为60min;在其余时间监控粒度为120min
2、在每天10:00~22:00期间,每次监控到的不符合预期的日志比例超过10%则通过邮件发送报警给相关人员,
邮件要求说明监控时段以及不符合预期的日志占这段时间日志的比例(精确到小数点后两位);在其余时间,
每次监控到的不符合预期的日志比例超过5%则对该次监控的结果进行记录,每天10:00统一发出报警邮件
3、监控脚本在默认情况下执行10:00~22:00的监控需求,其余时间的监控需求通过可配参数进行控制
4、对于一天内的监控结果进行汇总,将不符合预期的日志比例由高到低进行排序(要求给出对应不符合预期的日志比例产生的时间)
5、扩展内容,如果对于100台部署了该模块的服务器同时进行监控,怎么做

vi  monitor.sh

#!/bin/bash
##
## 第一个习题 最后修改于 2011-04-16 10:20
###文件目录 以及时间 限制 等信息
D=`pwd`
filename=1.log
mail_txt=$(date +%Y%m%d).mail.txt
date_h=`date +%H`
Limit_a="10"
Limit_b="5"

### 错误的行数
wrong_line=`awk -F "[,)(]+" -v a=0 '{if ($3 == "3" && $8 == "5" && $10 == "1") {a+=1}}END{print a}' ${filename}`

####当前小时内总log数量

total_line=`grep -E "$(date +"%Y %m:%d %H:")[0-9]+:[0-9]+" ${filename} |wc -l`
##total_line=`wc -l < ${filename}`

###百分比
###Percentage=`echo "scale=2;${wrong_line}/${total_line}" |bc`   ###精确到小数点后两位 例如 0.25
Percentage=`awk "BEGIN{c=($warning/$total)*100;printf(\"%d\",c)}"`
### 输出整数 例如 百分比为25% 输出为0.25

###开始跑程序
cd ${D}
if [ ${date_h} > "10" && ${date_h} < "22" ]; then
        if [ ${Percentage} > ${Limit_a} ]; then
                echo "date is : `date +"%Y %m:%d %H:"`" "perce is :"`awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` | mail -s "monitor log" liuhaifeng01@baidu.com
                ###输出结果 当前时间精确到小时,输出百分比精确到小数点后两位 发送邮件 例如 date is : 2011 04:16 09: perce is :30.43%

                echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
                ### 输出监控百分比到 汇总log中去  例如:2011:04:16:09 30.43%
        else
                echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
        fi
else
        case ${date_h} in
                "24")
                if [ ${Percentage} > ${Limit_b} ]; then
                        echo "date is : `date +"%Y %m:%d %H:"`" "perce is :"`awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> ${mail_txt}     
                        ###对百分比超出5%的数据进行记录

                        echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
                        ### 输出监控百分比到 汇总log中去  例如:2011:04:16:09 30.43%

                        mail -s "monitor log" liuhaifeng01@baidu.com < cat ${mail_txt}
                        ### 在24点最后一次统计的时候 将0-10点 22-24点中百分比超过5%的记录发送邮件

                        sort -r -k 2 monitor.log > new_monitor.log
                        ###排序 一天汇总的记录 按照第二字段 百分比的 由高到低的顺序排列
                else
                        echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
                        sort -r -k 2 monitor.log > new_monitor.log

                ;;
                *)
                if [ ${Percentage} > ${Limit_b} ]; then
                        echo "date is : `date +"%Y %m:%d %H:"`" "perce is :"`awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> ${mail_txt}
                        echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
                else
                        echo "`date +"%Y:%m:%d:%H"`" `awk "BEGIN{c=(${wrong_line}/${total_line})*100;printf(\"%0.2f\", c);print \"%\"}"` >> monitor.log
                fi
                ;;

        esac
fi

配合crontab执行

* */[10-22] * * * root bash monitor.sh

* [23-09]/2 * * * root bash monitor.sh

第三条要求 在shell中没有体现

关于第五条要求,希望大家给予意见,(*^__^*) 嘻嘻……