代码改变世界

Zabbix如何将告警信息写入日志文件

2024-09-29 08:18  潇湘隐者  阅读(103)  评论(0编辑  收藏  举报

这里介绍一下如何将Zabbix的告警信息写入日志文件。至于为什么要将Zabbix的告警信息写入日志文件呢?因为公司里面有两套监控系统,现在想将Zabbix的告警信息同步到另外一套监控系统中去,现在的方案是将Zabbix的告警写入一个日志文件,另外一套监控系统的Agent会定期扫描日志文件(增量),然后将日志文件中的告警信息采集过去。这里简单介绍一下这个需求的前因后果。

  1. 检查/修改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即可。

  1. 上传脚本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

上传脚本后授予执行权限。

  1. 创建媒介类型

Zabbix 6: 在Zabbix左边的菜单“管理”—>“媒介“下,点击右上角的“创建媒介类型“

Zabbix 7:

Zabbix 7跟Zabbix 6的界面有所不同了,需要在Zabbix的左侧菜单”告警”—>”媒介”下,点击右上角的“创建媒介类型”,如下截图所示:

具体设置如下:

  1. 修改用户的报警媒介

在用户里面设置“报警媒介“,如下截图所示:

  1. 设置触发器动作

在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]

1: https://www.zabbix.com/documentation/7.0/zh/manual/appendix/macros/supported_by_location