热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python脚本优化Zabbix多行日志监控

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python脚本优化-----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(‘
‘) #去掉列表中每一个元素的换行符
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 #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 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

技术图片
技术图片

到这里监控就完成了


推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍了Python中文件的基本操作,包括打开、读取、写入和关闭文件的方法,并通过实例展示了如何将Excel文件转换为CSV文件以及进一步转换为HTML文件。此外,还涉及了成绩等级替换的具体实现。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文介绍了如何使用 Python 的 Bokeh 库在图表上绘制菱形标记。Bokeh 是一个强大的交互式数据可视化工具,支持丰富的图形自定义选项。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 本文由杨勇和思远于2012年12月27日撰写,主要探讨了如何使用PHP进行网页内容抓取,特别是针对字符较多的网站。文章详细介绍了正则表达式失效的原因,并提供了优化方法,同时展示了如何抓取淘宝服饰栏、天气信息以及IP地址对应的地理位置。 ... [详细]
author-avatar
mobiledu2502931997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有