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 文件读写操作实例详解
Mar 12 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Python玩转加密的技巧【推荐】
May 13 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python 日志 logging模块详细解析
Mar 31 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
python爬取音频下载的示例代码
Oct 19 Python
教你怎么用Python生成九宫格照片
May 20 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
基于mysql的bbs设计(四)
2006/10/09 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
浅谈js原生拖放
2016/11/21 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python3几个常见问题的处理方法
2019/02/26 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
2014国庆节标语口号
2014/09/19 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
经费申请报告范文
2015/05/18 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
Python之matplotlib绘制饼图
2022/04/13 Python