【介绍】
官网:https://github.com/google/mtail
mtail 方式监控 统计关键字个数作为告警通知,来完成错误关键字的日志告警。
监控java 堆外内存溢出 关键字:OutOfDirectMemoryError
结合promethus mtail 方式,监控报错关键字实现告警。
一、【mtail配置】
mtail 是用于从应用程序日志中提取指标以导出到时间序列数据库或时间序列计算器以进行警报和仪表板显示的工具。简单来说,就是实时读取应用程序的日志,并且通过自己编写的脚本实时分析,最终生成时间序列指标的工具。
错误关键字统计
cat error_count.mtail ##格式 OutOfDirectMemoryError 堆外内存溢出关键字
counter error_count
/OutOfDirectMemoryError/ {
error_count++
}
后台启动命令:
nohup /data/soft/mtail -logtostderr -progs /data/soft/error_count.mtail -logs /data/java/nohup.out &
##-logtostderr -progs /data/soft/error_count.mtail mtail的规则
#–logs 采集的java日志输出
2.promethues 告警配置 promethues.yml
- job_name: 'mtail'
static_configs:
- targets: ['192.168.1.1:3903']
3.告警规则
cat /data/prom/mtail-rules.yml
groups:
- name: mtail-alerting
rules:
# down了超过1分钟
- alert: errorlog
expr: error_count{job="mtail"} > 0
for: 1m
labels:
severity: red
annotations:
summary: "java has error "
description: "java has error log more than 1min."
4.根据报警关键字,实现服务自动重启
重启脚本 restart.sh
#!/bin/bash
# java日志监控
# 1. 检索 nohup.out 日志文件中是否包含关键字
# 2. 如果包含,停止 java 服务;
# 3. 处理包含关键字的 java 日志文件;
# 4. 重新启动 java 服务。
# java 日志目录
LogHome=/data/java
time=$(date "+%Y%m%d%H%M")
time2=$(date "+%Y%m%d")
# 需要检索的关键字
searchKeywords="OutOfDirectMemoryError"
source /etc/profile
#echo "Enter apache-tomcat server home: ${LogHome}"
# 进入 日志目录
cd ${LogHome}
# 检索关键字在目录下所有文件中出现的次数。
matchesTimes=`grep "${searchKeywords}" ./nohup.out | wc -l`
if [ $matchesTimes -gt 0 ] ; then
# 如果出现了关键字
echo "We find fatal logs! We will shutdown, please hold on......"
# 检索出现关键字的文件名称数组
errorFiles=`grep -l "${searchKeywords}" ./nohup.out`
# 杀死进程
ps -ef|grep javaname |grep -v grep|awk '{print $2}'|xargs kill -9
# 进入目录,准备删除包含关键字的文件。
mv nohup.out nohup.out$time
# 退出到 Tomcat 根目录。
echo "The error files was moved,restart java now, please hold on......"
# 重启服务
cd ${LogHome} && nohup java -Xms128m -Xmx512m -jar javaname .jar>nohup.out 2>&1 &
echo "$time, java was restarted" >>healthlog/$time2-log
#重启mtail告警插件
ps -ef|grep mtail |grep -v grep|awk '{print $2}'|xargs kill -9
nohup /data/soft/mtail -logtostderr -progs /data/soft/error_count.mtail -logs /data/java/nohup.out > mtail-nohup.out 2>&1 &
echo "$time, mtail was restarted" >>healthlog/$time2-log
else
# 没有满足条件的文件,直接退出。
echo "$time, java is health " >>healthlog/$time2-log
exit
fi