检查Linux系统日志error和mysql错误日志的脚本

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介:

    对系统日志的检查和数据库日志的检查很重要,出现问题及时的通知系统管理员更为重要,本脚本用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]) 

 



本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1106735,如需转载请自行联系原作者


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
348
分享
相关文章
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
231 90
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
44 16
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
41 10
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
82 4
图解MySQL【日志】——两阶段提交
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
29 4
MySQL日志
本文介绍了MySQL中三个重要的日志:binlog、redolog和undolog。binlog记录数据库更改操作,支持数据恢复、复制和审计;redolog保证事务的原子性和持久性,实现crash-safe;undolog用于事务回滚及MVCC的实现。每个日志都有其独特的作用和应用场景,确保数据库的稳定性和数据一致性。
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
69 3
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
100 0

热门文章

最新文章