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下singleton模式的实现方法
Jul 16 Python
python函数的5种参数详解
Feb 24 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
Django框架模板的使用方法示例
May 25 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 Python
Python基于pip实现离线打包过程详解
May 15 Python
python实现文件分片上传的接口自动化
Nov 19 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 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
Smarty模板快速入门
2007/01/04 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
php实现图片添加水印功能
2014/02/13 PHP
php魔术变量用法实例详解
2014/11/13 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Python 学习笔记
2008/12/27 Python
Python计算字符宽度的方法
2016/06/14 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
详解python Todo清单实战
2018/11/01 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
电大自我鉴定范文
2013/10/01 职场文书
会计找工作求职信范文
2013/12/09 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
绿色环保演讲稿
2014/05/10 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
vue+spring boot实现校验码功能
2021/05/27 Vue.js