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学习笔记 下载
Feb 10 Python
浅析Python中的序列化存储的方法
Apr 28 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python中文编码与json中文输出问题详解
Aug 24 Python
Python正则表达式和re库知识点总结
Feb 11 Python
Python3.5运算符操作实例详解
Apr 25 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
用python计算文件的MD5值
Dec 23 Python
tensorflow2.0教程之Keras快速入门
Feb 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
Views rows style模板重写代码
2011/05/16 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
slice函数的用法 之不错的应用
2006/12/29 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
使用python解析xml成对应的html示例分享
2014/04/02 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
python 的topk算法实例
2020/04/02 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
《跨越百年的美丽》教学反思
2014/02/11 职场文书
岗位聘任书范文
2014/03/29 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
考博导师推荐信范文
2015/03/27 职场文书
会计岗位职责范本
2015/04/02 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
Nginx反向代理配置的全过程记录
2021/06/22 Servers
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏