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实现下载网易云音乐的高清MV
Mar 16 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
Python3写入文件常用方法实例分析
May 22 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python实现机器人行走效果
Jan 29 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
python爬取天气数据的实例详解
Nov 20 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 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
php4的session功能评述(二)
2006/10/09 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php检测文件编码的方法示例
2014/04/25 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python3调用R的示例代码
2018/02/23 Python
python语言基本语句用法总结
2019/06/11 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python3 下载网络图片代码实例
2019/08/27 Python
在pycharm中显示python画的图方法
2019/08/31 Python
python编写计算器功能
2019/10/25 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
Python Django路径配置实现过程解析
2020/11/05 Python
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
公司接待方案
2014/03/08 职场文书
银行内勤岗位职责
2014/04/09 职场文书
视光学专业自荐信
2014/06/24 职场文书
优秀英文求职信范文
2015/03/19 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
使用MybatisPlus打印sql语句
2022/04/22 SQL Server
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL