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中的map、reduce和filter浅析
Apr 26 Python
Python中的True,False条件判断实例分析
Jan 12 Python
Python3访问并下载网页内容的方法
Jul 28 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
Python笔记之工厂模式
Nov 20 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python打印不合法的文件名
Jul 31 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
Python数据分析入门之教你怎么搭建环境
May 13 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程序员工具
2008/05/26 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
解析argc argv在php中的应用
2013/06/24 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
React如何避免重渲染
2018/04/10 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python框架中flask知识点总结
2018/08/17 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python 实现多维数组转向量
2019/11/30 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
节约用水标语
2014/06/11 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
涨价通知怎么写
2015/04/23 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS