Shell脚本监控错误日志

错误日志事需要写到指定的文件位置,写脚本监控监控日志文件发企业微信告警。
分享下监控日志文件的思路,就是记录每次读取到的行号
用crontab 每隔一段时间调用就好,有记录行号不怕重复发送日志

#!/bin/bash
#监控错误日志
set -e -u -o pipefail
row_number=0 #初始行号 这边用sed记录了行号 用于从上一次的位置开始读取

wx(){
#读取日志发送到企业微信 企业微信机器人使用方法 https://blog.csdn.net/weixin_46175620/article/details/106936957
cat > $0.msg << EOF
curl '' \
   -H 'Content-Type: application/json' \
   -d '
   {
        "msgtype": "text",
        "text": {
            "content": "$1",
            "mentioned_mobile_list":["$2"]
        }
   }'
EOF
sh $0.msg
}
#进入日志目录 根据实际需求定
cd /data/logs/$(ls /data/logs|grep "log")
#监控的日志文件 根据实际需求定
log_file="$(pwd)/log.err"
#文件的最新行号
new_row_number=$(cat $log_file|wc -l)

if [ "$new_row_number" -eq "$row_number" -o "$new_row_number" -eq 0 ] ;then
	#新行号等于记录行号说明日志没有新增,直接退出
	exit 0
elif [ "$new_row_number" -lt "$row_number" ] ; then
	#新行号小于旧行号,日志被归档从新开始写,修改旧行号为0,下一次从新的位置开始读
	#4s是因为行号记录在本脚本的第4行
	sed -i '4s/row_number='${row_number}'/row_number=0/' $0
	row_number=0
else
	#修改记录的行号为新的行号
	sed -i '4s/row_number='${row_number}'/row_number='${new_row_number}'/' $0
	#轮训每行日志 发送到企业微信
	while [ "$new_row_number" -gt "$row_number" ]; do
		row_number=$(expr $row_number + 1)
		info=$(sed -n "$row_number"p $log_file)
		#去除重复的日志
		if [ $(grep "$(echo $info)" $(pwd)/$0.msg|wc -l) -eq 0 ];then
			#判断和前一次发的告警信息不同 发送到企业微信 过滤规则根据需求更改
			#echo $info
			wx "$info" ""
		fi 
	done
fi

exit 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值