对系统日志的检查和数据库日志的检查很重要,出现问题及时的通知系统管理员更为重要,本脚本用python写的监控脚本,主要是为zabbix监控自定义的key而准备的,当然大家也可以在返回值方面做修改,可以在写个发邮件的模块,做个定时,有问题自动发邮件(在之前写过一个发邮件的类,大家可以做参考:http://wangwei007.blog.51cto.com/68019/978743)。在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错误日志检测,也适用于单个示例的检测,根据自己的需求做修改。

  1. #!/usr/bin/env python 
  2. #encoding=utf-8 
  3. import os, sys 
  4.  
  5. def chk_err(log_file,tmp_file,type,print_list,port): 
  6.     cur_num = int(os.popen("sudo grep '' %s | wc -l" % log_file).read().strip()) 
  7.     old_num = 0 
  8.     if os.path.exists(tmp_file): 
  9.         old_num = int(open(tmp_file).read().strip()) 
  10.         if cur_num < old_num: 
  11.             os.popen("echo 0 > %s" % tmp_file) 
  12.             old_num = 0 
  13.     else
  14.         os.popen("echo 0 > %s" % tmp_file) 
  15.     err_log = os.popen("sudo grep -ni 'error' %s" % log_file).readlines() 
  16.     if err_log: 
  17.         err_list = [] 
  18.         for err in err_log: 
  19.             if int(err.split(":")[0]) > old_num: 
  20.                 err_list.append(err[len(err.split(":")[0])+1:]) 
  21.         if err_list: 
  22.             os.popen("echo %s > %s" % (err_log[-1].split(":")[0], tmp_file)) 
  23.             print_list.append(port) 
  24.  
  25. def chk_err_log(type): 
  26.     try
  27.         print_list = [] 
  28.         homedir = "/home/zabbix" 
  29.         if not os.path.exists(homedir): 
  30.             os.mkdir(homedir) 
  31.         if type == "syslog"
  32.             log_file = "/var/log/messages" 
  33.             tmp_file = "%s/.syslog_num"%homedir 
  34.             cur_num = int(os.popen("sudo grep '' %s | wc -l" % log_file).read().strip()) 
  35.             old_num = 0 
  36.             if os.path.exists(tmp_file): 
  37.                 old_num = int(open(tmp_file).read().strip()) 
  38.                 if cur_num < old_num: 
  39.                     os.popen("echo 0 > %s" % tmp_file) 
  40.                     old_num = 0 
  41.             else
  42.                 os.popen("echo 0 > %s" % tmp_file) 
  43.             err_log = os.popen("sudo grep -ni 'error' %s|grep -v snmpd|grep -v sftp" % log_file).readlines() 
  44.             if not err_log: 
  45.                 return "0" 
  46.             err_list = [] 
  47.             for err in err_log: 
  48.                 if int(err.split(":")[0]) > old_num: 
  49.                     err_list.append(err[len(err.split(":")[0])+1:]) 
  50.             if not err_list: 
  51.                 return "0" 
  52.             else
  53.                 os.popen("echo %s > %s" % (err_log[-1].split(":")[0], tmp_file)) 
  54.                 return "1" 
  55.         elif type == "mysqllog"
  56.             psinfo = os.popen("ps auxww|grep mysqld|grep -v root|grep -v grep").readlines() 
  57.             if not psinfo: 
  58.                 return "No mysqld running in this server now" 
  59.             for i in psinfo: 
  60.                 port = "0" 
  61.                 for j in i.split("--"): 
  62.                     if j.find("datadir") != -1
  63.                         datadir = j.split("=")[1].strip() 
  64.                     elif j.find("port") != -1
  65.                         port = j.split("=")[1].strip() 
  66.                 if port == "0"
  67.                     continue 
  68.                 if port == "3306"
  69.                     log_file = "%s/$(hostname).err" % datadir 
  70.                 else
  71.                     log_file = "%s/mysql.err" % datadir 
  72.                 tmp_file = "%s/.mysqllog_%s" % (homedir,port) 
  73.                 chk_err(log_file,tmp_file,type,print_list,port) 
  74.             if len(print_list)==0
  75.                 return "0" 
  76.             else
  77.                 return print_list 
  78.     except Exception, e: 
  79.         return e 
  80.  
  81. if __name__ == "__main__"
  82.     print chk_err_log(sys.argv[1])