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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python编程求质数实例代码
Jan 31 Python
Python装饰器用法实例总结
Feb 07 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
python中with用法讲解
Feb 07 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Python实现手势识别
Oct 21 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 setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
分享几个超级震憾的图片特效
2012/01/08 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
js转换对象为xml
2017/02/17 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python字符串处理实例详解
2017/05/18 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
pygame实现简易飞机大战
2018/09/11 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Pytorch之Variable的用法
2019/12/31 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
学历公证书范本
2014/04/09 职场文书
小小商店教学反思
2014/04/27 职场文书
2014年人事科工作总结
2014/11/19 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
三年级学生评语大全
2014/12/26 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
MySQL 数据类型选择原则
2021/05/27 MySQL