Shell腳本-簡單日志監控


一、前言

又是周五,甲方的電話在下班的節點響起,現網又出故障了,趕緊立刻馬上給我解決!
身為測試,總是受命於危難之間,在頂鍋的前線,戰戰兢兢,如履薄冰。
"這次是因為用戶瘋狂點保存,還未加載完數據,就保存,導致存了一個空數據,以致頁面被全部清空..."
"上次是研發夾帶私貨,修改了圖片計算的方式,導致全站圖片無法上傳"
為什么,為什么,每次都如此被動!

二、想法

通過編寫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"`=============

四、實操結果

后台日志

image

飛書機器人

image

五、后記

1.記錄

1)先在測試環境用用,以前可能前台頁面報錯,才會去看看后台日志檢查是否有錯誤日志,現在監控了日志目錄,在測試過程中,有異常馬上就能通知到,正常的case哪怕流程通過,可能還有隱藏的問題,不再浮於表面,加一道防線。
2)至於弄在現網環境現在有點難,客戶不會允許
3)shell腳本實現的過程比較簡單,主要是種上監控日志的萌芽,測試不止於上線之前的工作;
4)了解到還可用zabbix、k8s、開源監控平台,但是用shell腳本應該是他們的祖宗,簡單就完事了,復雜場景無法勝任,哈哈

2.遇到的坎

  • json轉義問題
  • crontab定時任務環境問題

3.后期優化

  • 解決日志中存在換行符、制表符導致json數據報錯問題,目前替換為空格
  • 添加報錯日志次數統計


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM