#场景:通过脚本从增量日志中抓取ERROR级别的日志推送到open-falcon的告警列表
#增量实现原理:复制log到其他目录,用文件记录最大行数,下次再取log副本用tail -n (本次总行数-上次行数) .log
#通过contab定时调用
#!/bin/bash
#跑批日志路径 ppbus_log_file="/opt/app/log-alarm/xxx.log"
#副本临时目录 clone_log_dir="/tmp/xxx.log"
#副本文件 clone_log_file="/tmp/xxx._log/xxx..log.bak"
#上一次日志副本的行数 pre_line=0 pre_line_file="/tmp/xxx._log/pre_line"
#当前获取日志的行数 curr_line=0
echo -------------------开始扫描ERROR级日志--------------------
#判断临时日志目录是否存在 if [ ! -d "$clone_log_dir" ]; then mkdir -p "$clone_log_dir" echo "创建备份目录成功:$clone_log_dir" fi
#备份 cp -rp "$ppbus_log_file" "$clone_log_file" echo "备份成功:$clone_log_file"
#计算副本的行数 curr_line=`wc -l /tmp/xxx._log/xxx.log.bak|awk '{print $1}'` echo "当前副本总行数:$curr_line"
if [ ! -f "$pre_line_file" ]; then pre_line=0 touch "$pre_line_file" else pre_line=`cat "$pre_line_file"` fi echo $curr_line > $pre_line_file
echo "上次副本总行数:$pre_line"
#1、如果行数都相同不处理 #2、如果历史的行数小于当时行数,说明日志新写了,需要把历史的行数清0,重新解析新的日志文件 if [ ${pre_line} = ${curr_line} ]; then echo "日志无更新不需要处理." exit 0 elif [ ${pre_line} -gt ${curr_line} ]; then pre_line=0 fi
let num=$curr_line-$pre_line echo "读取日志行数:${num}" err_msg=`tail -n $num xxx.log|grep ERROR|grep Exception|awk '{print $4 $6}'` if [ -z "$err_msg" ]; then echo "日志正常,未发现指定ERROR." exit 0 else echo "$err_msg" fi # #------------------------------------------API参数解说------------------------------------------- #metric: 最核心的字段,代表这个采集项具体度量的是什么, 比如是cpu_idle呢,还是memory_free, 还是qps #endpoint: 标明Metric的主体(属主),比如metric是cpu_idle,那么Endpoint就表示这是哪台机器的cpu_idle #timestamp: 表示汇报该数据时的unix时间戳,注意是整数,代表的是秒 #value: 代表该metric在当前时间点的值,float64 #step: 表示该数据采集项的汇报周期,这对于后续的配置监控策略很重要,必须明确指定。 #counterType: 只能是COUNTER或者GAUGE二选一,前者表示该数据采集项为计时器类型,后者表示其为原值 (注意大小写) #GAUGE:即用户上传什么样的值,就原封不动的存储 #COUNTER:指标在存储和展现的时候,会被计算为speed,即(当前值 - 上次值)/ 时间间隔 #tags: 一组逗号分割的键值对, 对metric进一步描述和细化, 可以是空字符串. 比如idc=lg,比如service=xbox等,多个tag之间用逗号分割 #说明:这7个字段都是必须指定 #------------------------------------------API参数解说------------------------------------------- #当前时间 ts=`date +%s` for line in $err_msg do echo "===============$line" curl -X POST -d "[{\"metric\": \"mem.swapfree.percent\", \"endpoint\": \"192.168.198.133\", \"timestamp\": $ts,\"step\": 60,\"value\": 60,\"counterType\": \"GAUGE\",\"tags\": \"sqlException\"}]" http://192.168.198.133:1988/v1/push
echo -------------------------------结束扫描ERROR级日志-----------------------