一、前言
又是周五,甲方的電話在下班的節點響起,現網又出故障了,趕緊立刻馬上給我解決!
身為測試,總是受命於危難之間,在頂鍋的前線,戰戰兢兢,如履薄冰。
"這次是因為用戶瘋狂點保存,還未加載完數據,就保存,導致存了一個空數據,以致頁面被全部清空..."
"上次是研發夾帶私貨,修改了圖片計算的方式,導致全站圖片無法上傳"
為什么,為什么,每次都如此被動!
二、想法
通過編寫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數據報錯問題,目前替換為空格
- 添加報錯日志次數統計