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写的一个wordpress的采集程序
Feb 27 Python
python并发2之使用asyncio处理并发
Dec 21 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
Python编写带选项的命令行程序方法
Aug 13 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 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
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
Python对象转换为json的方法步骤
2019/04/25 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
实习求职信
2013/12/01 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
英语生日邀请函
2014/01/23 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
Java tomcat手动配置servlet详解
2021/11/27 Java/Android
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript