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之从格式化表达式到方法
Sep 28 Python
matplotlib作图添加表格实例代码
Jan 23 Python
pandas通过loc生成新的列方法
Nov 28 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
对python生成业务报表的实例详解
Feb 03 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
基于python实现学生信息管理系统
Nov 22 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python如何实现图片压缩
Sep 11 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python实现byte转integer
Jun 03 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获取服务器信息的实现代码
2013/02/04 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
详解Document.Cookie
2015/12/25 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
python二分法实现实例
2013/11/21 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python @property装饰器原理解析
2020/01/22 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
乌克兰在线药房:Аптека24
2019/10/30 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
初中英语课后反思
2014/04/25 职场文书
暑期教师培训方案
2014/06/07 职场文书
天地会口号
2014/06/17 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
python游戏开发Pygame框架
2022/04/22 Python