Python脚本实现Zabbix多行日志监控过程解析

 更新时间:2020年08月26日 09:09:17   作者:Zabbix_Z大叔  
这篇文章主要介绍了Python脚本实现Zabbix多行日志监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

通过使用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入门_条件控制(详解)

    Python入门_条件控制(详解)

    下面小编就为大家带来一篇Python入门_条件控制(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • pycharm代码删除恢复的方法

    pycharm代码删除恢复的方法

    pycharm是一个很强大的编辑工具,很多朋友在使用过程中容易产生误操作,那么一不小心删除了,怎么恢复呢,今天就给大家介绍pycharm代码删除恢复教程,需要的朋友参考下吧
    2021-06-06
  • Python中的查找算法代码实例

    Python中的查找算法代码实例

    这篇文章主要介绍了Python中的查找算法代码实例,算法是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出,简单来说,算法就是解决一个问题的具体方法和步骤,算法是程序的灵魂,需要的朋友可以参考下
    2023-07-07
  • 浅谈Python之Django(三)

    浅谈Python之Django(三)

    这篇文章主要介绍了Python3中的Django,小编觉得这篇文章写的还不错,需要的朋友们下面随着小编来一起学习学习吧,希望能够给你带来帮助
    2021-10-10
  • Python中的面向对象编程详解(下)

    Python中的面向对象编程详解(下)

    这篇文章主要介绍了Python中的面向对象编程详解(下),本文讲解了继承、super关键字、重写、多重继承、类、实例和其他对象的内建函数、私有化等内容,需要的朋友可以参考下
    2015-04-04
  • Python requests库参数提交的注意事项总结

    Python requests库参数提交的注意事项总结

    这篇文章主要给大家介绍了关于Python requests库参数提交的注意事项,文中通过示例代码和图片介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Pycharm自动添加文件头注释和函数注释参数的方法

    Pycharm自动添加文件头注释和函数注释参数的方法

    这篇文章主要介绍了Pycharm自动添加文件头注释和函数注释参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python 递归调用返回None的问题及解决方法

    python 递归调用返回None的问题及解决方法

    这篇文章主要介绍了python 递归调用返回None的问题,本文通过实例代码给大家记录了解决方案,代码简单易懂,非常不错对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 详解Python如何查看一个函数的参数

    详解Python如何查看一个函数的参数

    inspect模块提供了许多用于检查对象的工具函数,其中包括用于获取函数参数信息的函数,所以在Python中,大家可以使用inspect模块来查看一个函数的参数信息,本文就来和大家讲讲具体操作吧
    2023-05-05
  • Python中的异常处理try/except/finally/raise用法分析

    Python中的异常处理try/except/finally/raise用法分析

    这篇文章主要介绍了Python中的异常处理try/except/finally/raise用法,结合实例形式分析了Python异常处理try/except/finally/raise相关功能与使用操作技巧,并附带了Python常见异常的表格说明,需要的朋友可以参考下
    2019-02-02

最新评论