一、前言
又是周五,甲方的电话在下班的节点响起,现网又出故障了,赶紧立刻马上给我解决!
身为测试,总是受命于危难之间,在顶锅的前线,战战兢兢,如履薄冰。
"这次是因为用户疯狂点保存,还未加载完数据,就保存,导致存了一个空数据,以致页面被全部清空..."
"上次是研发夹带私货,修改了图片计算的方式,导致全站图片无法上传"
为什么,为什么,每次都如此被动!
二、想法
通过编写shell脚本,实时获取应用最新的错误日志,然后发邮件给我
马上去跟运维沟通,是否有编写日志监控脚本,然后他给我讲了一堆困难
算了,自动动手,丰衣足食!
...
在实操过程中,发现用飞书机器人代替发邮件似乎更及时。
三、思路
1.编写监控日志脚本
-时间
-主机
-模块
-报错日志
-日志详情
2.调用飞书机器人
https://www.feishu.cn/hc/zh-CN/articles/360024984973
3.定时任务crontab
4.脚本
#!/bin/bash
#@Time: 2021年8月1日19:03:45
#@Target: 日志监控
#@Author: nsys
# 1)基础配置
log_dir="/opt/product/data/"
log_name=("weixin" "qq")
web_url="http://192.168.220.184:9005/portal/#"
#host_url=`ip a |grep 184 |awk -F '/' '{print $1}'|awk '{print $2}'|awk 'NR==1'`
host_url="192.168.220.184"
skip_dir=("test-data" "t-data")
# 2)robot配置
robot_curl(){
error_log=`tail -n 1000 $1 |grep ERROR -A2|tr "\n" " "|tr "\t" " "|tr '"' ' '`
if [ ${#error_log} -eq 0 ];then
echo "[INFO] - 暂无错误日志 - $1"
#exit 1
else
if [ ${error_log:0:10} == `date +"%Y-%m-%d"` ];then
echo "[ERROR] - 找到错误日志 - $1 "
dir="${1%/*}"
dir_app="${dir##*/}"
hook_url="https://open.feishu.cn/open-apis/bot/v2/hook/3b138b7b-c5a0-4772-a072-c96449139863"
curl $hook_url -X POST -H "Content-Type: application/json" -d \
"{
\"msg_type\": \"post\",
\"content\": {
\"post\": {
\"zh_cn\": {
\"title\": \"播控平台日志告警 - 测试环境\",
\"content\": [
[{
\"tag\": \"text\",
\"text\": \"告警时间: \"
},
{
\"tag\": \"text\",
\"text\": \"`date +"%Y年%m月%d日 %H:%M:%S"`\"
}
],
[{
\"tag\": \"text\",
\"text\": \"告警环境: \"
},
{
\"tag\": \"a\",
\"text\": \"测试环境\",
\"href\": \"$web_url\"
}
],
[{
\"tag\": \"text\",
\"text\": \"告警主机: \"
},
{
\"tag\": \"text\",
\"text\": \"$host_url\"
}
],
[{
\"tag\": \"text\",
\"text\": \"告警路径: \"
},
{
\"tag\": \"text\",
\"text\": \"$1\"
}
],
[{
\"tag\": \"text\",
\"text\": \"告警应用: \"
},
{
\"tag\": \"text\",
\"text\": \"$dir_app\"
}
],
[{
\"tag\": \"text\",
\"text\": \"报错详情: \"
},
{
\"tag\": \"text\",
\"text\": \"$error_log\"
}
]
]
}
}
}
}"
else
echo "[INFO] - 跳过以前日志 - $1"
fi
fi
}
# 3)遍历日志目录
read_dir(){
for file in `ls $1`
do
if [ -d $1"/"$file ];then
#if [[ $1"/"$file != *${skip_dir1}* ] -o [ $1"/"$file != *${skip_dir2}* ]];then
if [[ $1"/"$file == *${skip_dir[0]}* ]] || [[ $1"/"$file == *${skip_dir[1]}* ]] || [[ $1"/"$file == *${skip_dir[2]}* ]] ;then
echo "[WARN] - 跳过排除目录 - $1/$file"
else
echo "[INFO] - 开始遍历目录 - $1/$file"
read_dir $1"/"$file
fi
else
if [ ${file##*.} = "log" ];then
echo "满足条件日志路径:$1/$file" > /dev/null 2>&1
robot_curl $1/$file
else
echo "不满足条件日志路径:$1/$file" > /dev/null 2>&1
fi
fi
done
}
# 4)执行
echo -e "\n=============开始执行本次脚本:`date +"%Y年%m月%d日 %H:%M:%S"`=============="
for i in ${log_name[@]};do
echo "[INFO] - 进入遍历目录 - $log_dir$i"
read_dir $log_dir$i
done
echo -e "\n=============结束本次脚本执行`date +"%Y年%m月%d日 %H:%M:%S"`=============
四、实操结果
后台日志
飞书机器人
五、后记
1.记录
1)先在测试环境用用,以前可能前台页面报错,才会去看看后台日志检查是否有错误日志,现在监控了日志目录,在测试过程中,有异常马上就能通知到,正常的case哪怕流程通过,可能还有隐藏的问题,不再浮于表面,加一道防线。
2)至于弄在现网环境现在有点难,客户不会允许
3)shell脚本实现的过程比较简单,主要是种上监控日志的萌芽,测试不止于上线之前的工作;
4)了解到还可用zabbix、k8s、开源监控平台,但是用shell脚本应该是他们的祖宗,简单就完事了,复杂场景无法胜任,哈哈
2.遇到的坎
- json转义问题
- crontab定时任务环境问题
3.后期优化
- 解决日志中存在换行符、制表符导致json数据报错问题,目前替换为空格
- 添加报错日志次数统计