Python脚本实现Zabbix多行日志监控过程解析


Posted in Python onAugust 26, 2020

通过使用zabbix 日志监控 我发现一个问题 例如oracle的日志有报错的情况 ,通常不会去手动清理 这样的话当第二次有日志写进来的时候 zabbix的机制是回去检查全部日志,这样的话之前已经告警过的错误日志,又会被检查到,这样就会出现重复告警,而且zabbix的日志监控只能读到匹配当前行关键字的数据,感觉不太灵活, 比如我想要匹配到的关键字之后再当前关键字的下N行再去匹配另一个关键字这个时候就比较麻烦,在这里给大家推荐一个有效,便捷解决的方式。

通过Python脚本实现日志监控 要求 1 记录脚本检查日志位置,避免下次触发脚本的时候出现重复告警 2 关键字匹配支持正则 3 支持多个关键字查询,例如第一个关键字匹配到当之后在这个关键字的下N行再去匹配第二个关键字 具体传参格式
python3 npar.py /u03/z.txt '(ORA-|REEOR),(04030|02011)' 2

第一个参数是日志路径 第二个参数是关键字 第三个参数为 匹配到第一个表达式这种的关键字后再去地 N(2)行去匹配第二个关键词(04030|02011)具体脚本实现如下

import os
import sys
logtxt = "logtxt.txt"
def read_txt(files, start_line):
	data = []
data.append("")
with open(str(files) + "", "r",
		encoding = 'UTF-8') as f:
	for line in f.readlines():
	line = line.strip('\n')# 去掉列表中每一个元素的换行符
data.append(line)
# 记录本次的行数
wirte_log(len(data) - 1)
if len(data) > start_line:
	return data[start_line - 1: ]
else :
	print("开始行数大于文本文件总行数!")
def wirte_log(lines):
	global logtxt
with open(logtxt, "w") as file: #”w "代表着每次运行都覆盖内容
file.write(str(lines))
def read_log():
	global logtxt
if not os.path.exists(logtxt):
	with open(logtxt, "w") as file: #”w "代表着每次运行都覆盖内容
file.write(str(1))
with open(logtxt + "", "r", encoding =
		'UTF-8') as f:
	s_lines = f.readlines()
print("从第" + str(s_lines[0]) + "行开始")
return s_lines[0]
def deal_read_log(files, keyword,
		interval_line):
	keywords = keyword.replace("(", "").replace(
		")", "").replace("'", "").replace('"',
		'"').split(',')
start_keywords = keywords[0].split("|")
end_keywords = keywords[1].split("|")
start_line = read_log()
lines_data = read_txt(files, int(
	start_line))
for_line = 1
while (for_line < len(lines_data)):
	#print(for_line)
# print(lines_data[for_line])
#
if end_keywords in lines_data[for_line]:
	#print(lines_data[for_line])
# print("-------------------")
# for_line = for_line + 1
#
else :
	isexist = 0
for sk in start_keywords:
	if sk in lines_data[for_line]:
	isexist = 1
break;
if isexist == 1:
	#if start_keywords[0] in lines_data[
		for_line] or start_keywords[1] in
	lines_data[for_line]:
	#当前行有end_keywords
isexist2 = 0
for sk in end_keywords:
	if sk in lines_data[for_line]:
	isexist2 = 1
break;
if isexist2 == 1:
	#print("行数=" + str(start_line - 1 +
		for_line) + "-" + str(start_line - 1 +
		for_line))
print(lines_data[for_line])
else :
	#当前行没有end_keywords。 往下interval_line行去寻找
# 标记当前行数
flag_line = for_line
count = 1
for_line = for_line + 1
while (for_line < len(lines_data)):
	isexist3 = 0
for sk in end_keywords:
	if sk in lines_data[for_line]:
	isexist3 = 1
break;
if isexist3 == 1:
	#print("行数=" + str(start_line - 1 +
		flag_line) + "-" + str(start_line -
		1 + for_line))
for prin in range(flag_line, for_line +
		1):
	print(lines_data[prin])
break;
for_line = for_line + 1
if count == int(interval_line):
	break;
count = count + 1
for_line = for_line - 1
for_line = for_line + 1
if name == 'main':
	files = sys.argv[1]
if '.log' in files:
	logtxt = files.replace(".log",
		"_log.txt")
else :
	logtxt = files.replace(".txt",
		"_log.txt")
# files = "ora.txt"
keywords = sys.argv[2]
# keywords = "'((04030|04000),ORA-)'"
#上下关联行数
interval_line = int(sys.argv[3])
# interval_line = 10
deal_read_log(files, keywords,
	interval_line)

接下来就是添加监控了

在agent的conf 文件里面添加UserParameter

Python脚本实现Zabbix多行日志监控过程解析
Python脚本实现Zabbix多行日志监控过程解析

到这里监控就完成了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取当前时间对应unix时间戳的方法
May 15 Python
python读写json文件的简单实现
Apr 11 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
Python变量访问权限控制详解
Jun 29 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python实现猜拳游戏
Mar 04 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
如何把python项目部署到linux服务器
Aug 26 #Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 #Python
python 多线程死锁问题的解决方案
Aug 25 #Python
详解Pycharm与anaconda安装配置指南
Aug 25 #Python
Python如何爬取51cto数据并存入MySQL
Aug 25 #Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 #Python
Python使用requests模块爬取百度翻译
Aug 25 #Python
You might like
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
PHP多进程编程实例详解
2017/07/19 PHP
php扩展开发入门demo示例
2019/09/23 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
使用Python脚本操作MongoDB的教程
2015/04/16 Python
编写Python CGI脚本的教程
2015/06/29 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
windows下python和pip安装教程
2018/05/25 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
网吧收银员岗位职责
2013/12/14 职场文书
主题班会演讲稿
2014/05/22 职场文书
教师个人师德总结
2015/02/06 职场文书
2015年化验员工作总结
2015/04/10 职场文书
行政上诉状范文
2015/05/23 职场文书
2016年父亲节寄语
2015/12/04 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers