如何实现监视多台服务器的日志?

Bash

1 前言

一个问题,一篇文章,一出故事。
今天遇到需要根据PostFix的特定邮箱地址触发一个电话报警,于是整理当前章节。

2 最佳实践

2.1 测试环境

如何使用HAProxy配置PostFix集群?

2.2 部署监控脚本

2.2.1 创建脚本

vim ~/scripts/fireWarning.sh

加入如下配置,

#!/bin/bash

logFile="/var/log/maillog"
checkLog="/var/log/fireWarning.log"
searchString="will@cmdschool.org"
hostList="postfix01.cmdschool.org postfix02.cmdschool.org"
callUrl="http://phome.cmdschool.org/firealerts/call_api.php?userID=xxxx&password=xxxx&group=4&count=2&result=1&alert=will"

# 单服务器日志检索函数
# 参数:$1日志路径 $2检索关键词
getLogs() {
  logFile="$1"
  searchString="$2"

  # 获取匹配的日志
  grepLog=$(grep "$searchString" "$logFile")

  echo "$grepLog"
}

# 检查是否有新的日志(主函数)
checkLogs() {
  # 检查日志的标识
  errorCounter=0

  # 不存在去重日志则创建,创建失败则退出函数
  if [ ! -f "$checkLog" ]; then
    touch "$checkLog"
    if [ $? -ne 0 ]; then
      echo "Error creating log file $checkLog"
      return 0
    fi
  fi

  # 遍历所有服务器
  getLog=""
  for hostName in $hostList; do
    ping -c 1 "$hostName" > /dev/null 2>&1
    if  [ $? -ne 0 ]; then
      continue
    fi
    getLog="$getLog"$'\n'$(ssh "$hostName" "$(declare -f getLogs); getLogs $logFile $searchString")
  done
  
  # 无匹配日志,直接返回
  if [ -z "$getLog" ]; then
      return
  fi

  # 逐行检查返回日志是否是新日志
  IFS=$'\n'
  for errLog in $getLog; do
    if grep -qF "$errLog" "$checkLog"; then
      continue
    fi
    
    # 将新的日志写入检查日志
    echo "$errLog" >> "$checkLog"

    # 统计写入的日志的总数
    errorCounter=$(($errorCounter + 1))
  done

  echo "$errorCounter"
}

# 如果没有返回新日志直接退出
errorCounter="$(checkLogs)"
if [ "$errorCounter" -eq "0" ]; then
  exit
fi

# 触发电话接口
curl "$callUrl" > /dev/null 2>&1

2.2.2 测试脚本

bash ~/scripts/fireWarning.sh

2.2.3 设置脚本触发

crontab -e

加入如下设置,

*/1 * * * * bash ~/scripts/fireWarning.sh
没有评论

发表回复

Bash
如何在远程主机执行函数?

1 前言 一个问题,一篇文章,一出故事。 笔者今天想在远程机器执行本地脚本定义的函数,于是整理当前章 …

Bash
如何用Base Shell推送华为消息?

1 前言 一个问题,一篇文章,一出故事。 今天遇到服务器推送华为消息失败,于是尝试使用curl去测试 …

Bash
如何用Tigase监控nginx服务?

1 前言 一个问题,一篇文章,一出故事。 笔者今天遇到Nginx代理的上游服务器报错,由于Nginx …