Zabbix如何将告警信息写入日志文件
2024-09-29 08:18 潇湘隐者 阅读(103) 评论(0) 编辑 收藏 举报这里介绍一下如何将Zabbix的告警信息写入日志文件。至于为什么要将Zabbix的告警信息写入日志文件呢?因为公司里面有两套监控系统,现在想将Zabbix的告警信息同步到另外一套监控系统中去,现在的方案是将Zabbix的告警写入一个日志文件,另外一套监控系统的Agent会定期扫描日志文件(增量),然后将日志文件中的告警信息采集过去。这里简单介绍一下这个需求的前因后果。
检查/修改Zabbix Server的参数文件zabbix_server.conf,如下所示,需要设置下面两个参数
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts
ExternalScripts=/usr/local/zabbix/share/zabbix/externalscripts
修改参数文件zabbix_server.conf后重启Zabbix Server使之生效。
# systemctl restart zabbix_server
注意:其实当前情况下,只需设置设置参数AlertScriptsPath即可。
上传脚本zabbix_alert_log.sh
往/usr/local/zabbix/share/zabbix/alertscripts目录上传脚本zabbix_alert_log.sh,脚本内容如下所示:
#!/bin/bash
PARM1=$1
echo "$PARM1 " >> /home/zabbix/zabbix.alert.log
上传脚本后授予执行权限。
创建媒介类型
Zabbix 6: 在Zabbix左边的菜单“管理”—>“媒介“下,点击右上角的“创建媒介类型“
Zabbix 7:
Zabbix 7跟Zabbix 6的界面有所不同了,需要在Zabbix的左侧菜单”告警”—>”媒介”下,点击右上角的“创建媒介类型”,如下截图所示:
具体设置如下:
修改用户的报警媒介
在用户里面设置“报警媒介“,如下截图所示:
设置触发器动作
在Zabbix的左侧菜单“告警“—》“动作”—》“触发器动作“里面,点击右上角的”创建动作“,如下所示,创建一个名为”zabbix_alert_log“的动作。
可以在条件中设置过滤条件,对告警信息进行过滤,符合条件的才会触发触发器。然后点击“操作1“,执行下面修改。
其中步骤输入1-1,后面一个数字不要输入大于1,这个会导致告警信息多次写入
勾选“自定义消息内容”,然后再主题和消息中填写下面内容:
主题:Problem: {EVENT.NAME}
消息:{EVENT.DATE} {EVENT.TIME} {EVENT.SEVERITY} {EVENT.ID} {HOST.NAME} {EVENT.NAME}
这里的ENVET.NAME,EVENT.DATE其实是Zabbix的宏变量,具体代表的意义可以参考官方文档[1],这里就不做重复述说了。
其实这些值就是zabbix数据库events表的相关数据。
至此,配置成功,如果Zabbix出现告警或错误,就会将其对应的宏信息写入日志。
前面的脚本,是将告警日志写入一个文件,如果出现大量的告警,以及随着时间的推移,zabbix.alert.log将会变得越来越大,这样也会影响Agent工具扫描读取新增的告警。 那么我们有必要每天切换、归档这个日志文件,于是写了下面脚本rotation_log.sh
#!/bin/bash
#source /etc/profile
#########################################################################################
# #
# This script is used for rotation log #
# #
# #######################################################################################
# #
# ScriptName : rotation_log.sh #
# Author : Kerry #
# CerateDate : 2024-09-12 #
# Blogs : https://www.cnblogs.com/kerrycode #
# Email : kerry2008code@qq.com #
#***************************************************************************************#
# 变量配置 #
#---------------------------------------------------------------------------------------#
# 注意,需要设置脚本的下面变量 #
#---------------------------------------------------------------------------------------#
# MAIL_FROM 邮件发送人 #
# MAIL_TO 邮件接收人 #
# LOG_FILE 设置脚本的输出日志文件 #
# LOG_KEEP_DAYS 设置轮转日志保留天数 #
#***************************************************************************************#
# 脚本参数 #
# $1 日志文件(绝对路径) #
# $2 日志文件后缀 #
#***************************************************************************************#
# Version Modified Date Description #
#***************************************************************************************#
# V.1.0 2024-09-12 创建此脚本 #
#########################################################################################
#轮转日期改为前一天
LOG_ROTATION_DATE=$(date -d yesterday +%Y%m%d)
MAIL_SUBJECT=""
MAIL_FROM="`hostname`@yict.com.cn"
MAIL_TO="ts-dba@yict.com.cn"
LOG_KEEP_DAYS=30
# Log输出方式:log或out或mail或log_out或all
LOG_OUT_TYPE=log_out
LOG_FILE=/home/zabbix/logs/rotation.log
ARGS=$#
SOURCE_LOG_FILE=$1
LOG_TYPE=$2
# 记录脚本的输出日志信息
function log_info()
{
#判断参数个数
if [ $# -eq 1 ];then
local log_msg=$1
else
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
fi
case $LOG_OUT_TYPE in
out)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
;;
log)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
mail)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
log_out)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
all)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
*)
esac
}
# 记录脚本的错误信息
function log_error()
{
#判断参数个数
if [ $# -eq 1 ];then
local log_msg=$1
else
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
fi
case $LOG_OUT_TYPE in
out)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
;;
log)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
mail)
echo "$1" | mailx -s "rotation_log.sh on the `hostname` failed ,please check the log!" -r ${MAIL_FROM} ${MAIL_TO}
;;
log_out)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
;;
all)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $LOG_FILE
echo "$1" | mailx -s "rotation_log.sh on the `hostname` failed ,please check the log!" -r ${MAIL_FROM} ${MAIL_TO}
;;
*)
esac
}
# 环境变量检查
function check_enviroment(){
# 此处不检查是否安装mailx
:<<!
if [ ! -x /bin/mailx ];then
log_error "`date`>usage:mailx did not exists!"
exit -1
fi
!
LOG_FILE_PATH=$(dirname $LOG_FILE)
#ALERT_LOG_PATH目录不存在则创建目录
if [ ! -d $LOG_FILE_PATH ] ; then
log_error "the $LOG_FILE_PATH didn't exists"
exit 1
fi
}
# 轮转日志文件
function rotation_log(){
#轮换/切换日志文件
#注意:赋值的=号前后不要有空格
NEW_LOG_NAME=$(basename $SOURCE_LOG_FILE .$LOG_TYPE)
LOG_PATH=$(dirname $SOURCE_LOG_FILE)
if [ -f "$LOG_PATH/${NEW_LOG_NAME}.$LOG_TYPE".${LOG_ROTATION_DATE} ] ; then
log_info "the log file have been rotated!"
else
cat $SOURCE_LOG_FILE > $LOG_PATH/${NEW_LOG_NAME}.$LOG_TYPE.${LOG_ROTATION_DATE}
#最后运行的命令的结束代码(返回值)
if [ $? -eq 0 ]; then
cat /dev/null > $SOURCE_LOG_FILE
else
log_error "failed to rotate the log file"
fi
fi
}
# 删除过期日志
function delete_old_log(){
#LOG_PATH=$(dirname $SOURCE_LOG_FILE)
#删除指定天数前的日志文件
#find $LOG_PATH -name ${LOG_TYPE} -type f -mtime +$LOG_KEEP_DAYS -delete
# 写死目录,避免调用是误删文件。
find /home/zabbix -name ${LOG_TYPE} -type f -mtime +$LOG_KEEP_DAYS -delete
}
main(){
if [ $ARGS != 2 ]; then
log_error "This script must be run with one parameter"
log_info "Usage:sh rotation_log.sh /home/mysql/test.log log"
exit 1
fi
if [ ! -f $SOURCE_LOG_FILE ];then
log_error "$SOURCE_LOG_FILE didn't exists, please check it"
exit 1
fi
check_enviroment
rotation_log
}
main
然后设置一个crotab作业,定期运行这个脚本
##############################################################################################
0 0 * * * /home/zabbix/scripts/rotation_log.sh /home/zabbix/zabbix.alert.log log
##############################################################################################
1: https://www.zabbix.com/documentation/7.0/zh/manual/appendix/macros/supported_by_location