python检查Linux系统日志与mysql错误日志的脚本

发布时间:2020-11-18编辑:脚本学堂
本文分享一例python脚本,用于检查Linux系统日志error和mysql错误日志,有需要的朋友参考下吧。

本脚本用python写的监控脚本,主要是为zabbix监控自定义的key而准备的,也可以在返回值方面做修改,可以写个发邮件的模块,做个定时,有问题时自动发邮件。

这里分享几个python发送邮件的方法,可以参考:
python smtplib模块发送邮件
python smtp模块发送邮件的
python发送邮件的脚本
python发送邮件的例子
python发送邮件的实例代码
python 发送邮件的代码
在zabbix中自定义key来检测系统日志和数据库日志:
 

复制代码 代码示例:
UnsafeUserParameters=1
UserParameter=check.sys_error,/usr/local/zabbix/bin/chk_err_log.py syslog
UserParameter=check.mysql_error,/usr/local/zabbix/bin/chk_err_log.py mysqllog

本脚本适用于:
一台服务器多实例的mysql错误日志检测,以及单个示例的检测。
可以根据自己的需求做修改。

代码:
 

复制代码 代码示例:
#!/usr/bin/env python
# site:www.jb200.com
#
#encoding=utf-8
import os, sys
 
def chk_err(log_file,tmp_file,type,print_list,port):
    cur_num = int(os.popen("sudo grep '' %s | wc -l" % log_file).read().strip())
    old_num = 0
    if os.path.exists(tmp_file):
        old_num = int(open(tmp_file).read().strip())
        if cur_num < old_num:
            os.popen("echo 0 > %s" % tmp_file)
            old_num = 0
    else:
        os.popen("echo 0 > %s" % tmp_file)
    err_log = os.popen("sudo grep -ni 'error' %s" % log_file).readlines()
    if err_log:
        err_list = []
        for err in err_log:
            if int(err.split(":")[0]) > old_num:
                err_list.append(err[len(err.split(":")[0])+1:])
        if err_list:
            os.popen("echo %s > %s" % (err_log[-1].split(":")[0], tmp_file))
            print_list.append(port)
 
def chk_err_log(type):
    try:
        print_list = []
        homedir = "/home/zabbix"
        if not os.path.exists(homedir):
            os.mkdir(homedir)
        if type == "syslog":
            log_file = "/var/log/messages"
            tmp_file = "%s/.syslog_num"%homedir
            cur_num = int(os.popen("sudo grep '' %s | wc -l" % log_file).read().strip())
            old_num = 0
            if os.path.exists(tmp_file):
                old_num = int(open(tmp_file).read().strip())
                if cur_num < old_num:
                    os.popen("echo 0 > %s" % tmp_file)
                    old_num = 0
            else:
                os.popen("echo 0 > %s" % tmp_file)
            err_log = os.popen("sudo grep -ni 'error' %s|grep -v snmpd|grep -v sftp" % log_file).readlines()
            if not err_log:
                return "0"
            err_list = []
            for err in err_log:
                if int(err.split(":")[0]) > old_num:
                    err_list.append(err[len(err.split(":")[0])+1:])
            if not err_list:
                return "0"
            else:
                os.popen("echo %s > %s" % (err_log[-1].split(":")[0], tmp_file))
                return "1"
        elif type == "mysqllog":
            psinfo = os.popen("ps auxww|grep mysqld|grep -v root|grep -v grep").readlines()
            if not psinfo:
                return "No mysqld running in this server now"
            for i in psinfo:
                port = "0"
                for j in i.split("--"):
                    if j.find("datadir") != -1:
                        datadir = j.split("=")[1].strip()
                    elif j.find("port") != -1:
                        port = j.split("=")[1].strip()
                if port == "0":
                    continue
                if port == "3306":
                    log_file = "%s/$(hostname).err" % datadir
                else:
                    log_file = "%s/mysql.err" % datadir
                tmp_file = "%s/.mysqllog_%s" % (homedir,port)
                chk_err(log_file,tmp_file,type,print_list,port)
            if len(print_list)==0:
                return "0"
            else:
                return print_list
    except Exception, e:
        return e
 
if __name__ == "__main__":
    print chk_err_log(sys.argv[1])