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