Shell脚本实现Linux错误日志监控告警

作者: siediyer 分类: linux 发布时间: 2021-10-24 01:47

前文有讲到,最近部署了一个服务
但是老是被恶意的扫描
虽然利用nginx禁止了些IP
但我还是想在被恶意扫描时候收到一个通知信息
让我能知道我的服务器又被访问了
于是乎,就有了这篇文章

此文目的是为了记录自己的操作步骤
既给自己一个复习的机会,同时也能服务看到此文的读者
好了,话不多说
接下来开始正文内容


整体的思路如下:

  1. 既然是监控,比较方便的方式就是利用Linux的cron定时任务来定时去执行一个操作
  2. 既然是要能被定时任务执行的操作,那么我们就需要写一个shell脚本
  3. shell脚本需要做什么呢?我们可以去匹配某个时间段,在时间段内是否有新的内容添加进去(日志文件肯定有记录时间的),如果有的话,则把这段内容单独取出来,并发送邮件通知
  4. 上面又涉及到了发邮件,发邮件比较好的方式是写个Python脚本(因为我的服务器自带了python环境,而且python运行起来也简单)
  5. 所以,总结下来我们需要两个文件(假定都存放在/opt/mysh/目录):一个是可执行的shell脚本;一个是发邮件的python脚本文件。并设定一个cron定时任务。
接下来就是开始写个shell脚本,如下(文件名:monitor_nginx_log.sh):
#!/bin/bash
#日志文件路径
logfile=/var/log/nginx

#当天日期,年月日
cur_date=`date +"%Y/%m/%d"`

#开始时间(3分钟前),时分秒
start_time=`date -d"3 minutes ago" +"%H:%M:%S"`

#结束时间,时分秒
stop_time=`date +"%H:%M:%S"`

#把新增的错误日志写到new_error_log中
tac $logfile/error.log | awk -v st="$start_time" -v et="$stop_time" -v dt="$cur_date" '{t=$2;t1=$1; if(dt==t1 && t>=st && t<=et) {print $0}}' > $logfile/new_error_log.txt

file_size=`du $logfile/new_error_log.txt | awk '{print $1}'`

#new_error_log文件大小不为0,发送邮件通知
if [[ $file_size -gt 0 ]];then
  echo `date +'%Y/%m/%d %H:%M:%S'`" there are new errors in nginx error.log" | cat >> /opt/mysh/monitor.log
  /usr/bin/python2.7 /opt/mysh/send_mail.py | tee -a /opt/mysh/monitor.log
fi

ps: 上面的脚本有好几个命令,如果有疑问的话,请往下看,会有解释的

然后呢,我们还要有一个邮件发送脚本(send_mail.py),如下:
# -*- coding: utf-8 -*-
import os
import smtplib
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

# 邮箱定义
smtp_server = 'smtp.163.com'
smtp_port = 25
from_addr = 'from_addr@163.com'
password = os.environ.get('MAIL_PASSWD')
to_addr = 'to_addr@163.com'

# 邮件对象
msg = MIMEMultipart()
msg['From'] = _format_addr('发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('【Support】发现错误', 'utf-8').encode()

# 邮件正文是MIMEText:
html = "<html><body><h4>检测有错误发生,详情见附件!</h4></body></html>"
msg.attach(MIMEText(html, 'html', 'utf-8'))

# 添加附件
file_path = "/var/log/nginx/new_error_log.txt"
attachment = MIMEApplication(open(r'file_path', 'rb').read())
attachment.add_header('Content-Disposition', 'attachment', filename="new_error_log.txt")
msg.attach(attachment)

# 发送邮件
print('开始发送邮件>>>')
try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addr, msg.as_string())
    server.quit()
except Exception, e:
    print "邮件发送异常:" + e
finally:
    print('结束邮件发送<<<')

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

Title - Artist
0:00