日志监控,是一种外挂式的采集。通过读取进程打印的日志,来进行监控数据的采集与汇聚计算。汇聚成标准的时间序列数据之后,推送给统一的后端存储。日志监控是一种典型的应用、业务监控的手段,如果我们没法在应用程序里内嵌SDK埋点,使用日志监控不失为一种折中方案。

这么说好像还不太明白日志监控到底能够做什么,简单点就是说就是对程序的日志内容进行过滤,如果出现了我们设定的关键字,对其进行计数当达到一定数量时可以触发报警。

下面来看一下需要哪些步骤:

1、不断的监听日志文件,获取最新的日志内容

2、正则功能对日志内容进行过滤

3、计数功能,触发报警

第一步的实现其实很简单,我参考了 python实现tail -f 功能 这篇文章有兴趣的话可以看一下。

思路是什么呢

  • 打开一个文件,把指针移到最后。

  • 每隔1秒钟获取一下日志内容

看一下代码吧

import time
import sys file = '/Users/cyt/work/my_python/script/logMonitoring/test.txt'with open(file,'r') as f:f.seek(0,2)while True:line = f.readline()if line and line!= '\n':    #空行不打印sys.stdout.write(line)time.sleep(1)

这样就可以实现一个不断监听日志文件并打印最新内容的功能了

代码中用到了seek , stdout.write。stdout.writeprint 的区别就是 print 会打印换行符,stdout.write 打印换行符。

在上面的代码中

sys.stdout.write(line) #等同line.strip()
print(line)

这里有个问题,那就是 sleep(1) 当我们同时写入多行内容到一个文件时,会一行一行很慢的打印出来。你可以把时间调小一点,但下面会说一个更好的方法。(你会说直接不用sleep不就行了,你可以尝试一下,然后观察该进程在系统中的cpu使用率)

你哪怕设置为0.1 都要比不设置sleep好很多,下图是设置为0.1的效果

使用类实现上面的逻辑,并改进打印速度的问题。

class LogMonitoring():def __init__(self,file_name):self.__file_name = file_namedef source(self):with open(self.__file_name) as f:f.seek(0,2)while True:data = f.readlines()# 可以添加日志量的监控,如果line列表越长说明单位时间产生的日志越多# print(len(line))   for line in data: if line != '\n':    #空行不处理sys.stdout.write(line)time.sleep(1)file = '/Users/cyt/work/my_python/script/logMonitoring/test.txt'
test  = LogMonitoring(file)
test.source()

如何解决刚刚说过的那个问题呢,很简单把f.readline() 替换为 f.readlines()区别想必很多人都知道,这里再说明一下。前者每次获取一行内容,后者是获取到当前指针到末尾所有的内容,返回一个列表每一个列表元素就是一行内容。然后我们遍历这个列表,输出列表元素就可以了。

这个速度是非常快的,相当于不加sleep的速度,其实就算你设置sleep为0.1 如果一下写入上千行内容,那么要近两分钟的时间才能打印完(0.1 * 1000 =100s)。

然后你还可以使用len(line) 获取列表长度,以此来获取单位时间内产生日志的数量,这个单位时间就是sleep的时间。这个单位时间内产生的日志数量,这个指标在某些需求中很有用。

你不用担心列表会占用大量内存的问题,即使是一个长度为1000的列表也不会占用大量的内存(几MB吧),况且应该很难遇到1秒中写入这么多日志的情况吧,即使有也很好解决,调短sleep的时间。或者你可以测试一下一个长度1万的列表会占用多大的内存。使用sys.getsizeof 可以自己玩一下。

到这里第一个问题应该算是搞定了

剩下的的两个我先把完整代码贴出来再一起说吧

class LogMonitoring():def __init__(self,file_name,pattern,threshold):self.__file_name = file_nameself.__pattern = patternself.__threshold = thresholdself.__count = 0def source(self):with open(self.__file_name) as f:f.seek(0,2)while True:data = f.readlines()# 可以添加日志量的监控,如果line列表越长说明单位时间产生的日志越多# print(len(line))   for line in data: if line != '\n':    #空行不处理self.check(line)time.sleep(1)#匹配规则def check(self,data):if re.search(f'{self.__pattern}.*?', data):self.call()return 0else:return 1#报警规则def call(self,):self.__count += 1if self.__count > self.__threshold:print('***********')

调用逻辑就是,source获取日志内容,把内容给到check方法去过滤如果匹配设置的规则,那么调用call方法进行计数并判断计算器是否超过阀值。

这两个功能我没有测试(因为我突然发现我要做的不是这个东西),整个逻辑就是这样了。

正则的使用可以看这两篇文章: Python 中的正则表达式 和 正则表达式

最后说一些可以优化的点吧。

1、call 报警规则哪里可以完善一下,添加自己想要的告警规则,还可以在写一个告警途径,发挥自己的想象。或者你这里只需要有一个计数的功能,返回计数器的值,结合现成的监控系统去做监控(zabbix就OK)

2、可以建一个单独的配置文件 conf.py ,文件的路径、正则表达式的规则,匹配规则、报警规则等等都可以在这里配置

3、还有一个问题就是程序运行的过程中,日志被备份清空或者切割了,怎么处理。其实很简单,你维护一个指针位置,如果下次循环发现文件指针位置变了(tell()方法返回文件的当前位置,即文件指针当前位置。),从最新的指针位置开始读就行

4、可以考虑使用异步(协程)、线程来提高速度。

这是滴滴开源监控系统夜莺的日志监控,可以参考一下它的功能,使用go语言实现的。

Python 实现日志监控相关推荐

  1. python 实时日志监控_python动态监控日志内容的示例

    #!/usr/bin/python # encoding=utf-8 # Filename: monitorLog.py import os import signal import subproce ...

  2. python 实时日志监控_python监控nginx实时日志并实现钉钉报警

    # !/usr/bin/python # --*coding:utf-8 -*- ''' auth:kilig desc:监控Nginx后端服务响应的状态,一旦响应时间超过2ms,累计次数超过1次,将 ...

  3. 实例代码分享Python实现Linux监控

    本文通过实例代码给大家介绍了Python实现Linux监控的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 工作原理:基于/proc 文件系统 Linux 系统为管理员提供了非常好的方 ...

  4. python监控错误语句,基于Python的关键字监控及告警

    基于Python的关键字监控及告警 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  基于Python的关键字监控及告警.txt ] (友情提示:右键点上行txt文档 ...

  5. 如何打造一个TB级微服务海量日志监控平台

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 来源:性能与架构.图文编辑:xj 本文主要介绍怎么使用 ELK Stack 帮助我们打造一个支撑起日产 TB 级的日志监控系统.在企业级的 ...

  6. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  7. python做服务器监控_使用python进行服务器的监控

    在Linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的:百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统: Linux 系统为管理员提供 ...

  8. 前端错误日志监控-sentry安装

    前端错误日志监控-sentry 之 安装篇 文章目录 前端错误日志监控-sentry 之 安装篇 题外话 senrry 「哨兵」 优点 正题:senrry 安装 安装 docker 下载安装脚本 修改 ...

  9. 阿里云使用笔记-第六篇-CentOS搭建Sentry日志监控平台

    一,前言 由于前端项目运行在用户各自电脑的浏览器上, 对于浏览器差异所导致的问题,正常情况下是没有办法拿到的 我们可以使用日志监控平台对客户端产生的问题进行收集统计,以便及时处理搭建Sentry(哨兵 ...

最新文章

  1. .NET 6 Preview5+VS2022实战千万并发秒杀项目,帅爆了(附源码)
  2. oracle 表 上限,Oracle分区表(Partition Table)的数量限制
  3. 【Java】Eclipse输入命令行参数的方法
  4. ajax引入html_Vue中发送ajax请求的库有哪些?
  5. html跳动爱心代码,html+css实现跳动爱心❥(^_-)-Go语言中文社区
  6. Poj(2225),三维BFS
  7. 30岁学python有前途吗-为什么做大数据一定要学Python?
  8. SPOJ DISUBSTR Distinct Substrings 后缀数组
  9. arcgis地理配准_【更新69篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  10. java极简使用FastFDFS文件服务器上传图片
  11. Q-learning 算法工作原理
  12. iOS新知识学习之React Native开发工具集
  13. matlab三相触发电路图,三相过零触发电路图
  14. UVA 10306 e-Coins(二维完全背包)
  15. 爬取游戏优惠信息,并且将结果发送到邮箱
  16. 维度灾难 维数灾难 暂记
  17. 百度云加速边缘计算功能设置判断移动端跳转
  18. 【CTF bugku 秋名山车神】关于会话脚本、session、正则表达式
  19. 国产化适配之人大金仓数据库(一)安装启动测试
  20. Chrome上最好用的广告拦截插件:AdBlock

热门文章

  1. 蓝天保卫战-环保用电监管云平台(安科瑞 须静燕)
  2. 世界杯梦幻阵容HTML5代码,FIFA足球世界世界杯模式阵容搭配推荐
  3. 【学习方法】关于记忆方法的思考,如何快速、短时、高效地记忆内容?
  4. Auto CAD Mac版基础入门必看
  5. 图文并茂,让ATEasy驱动配置更easy!
  6. 2021-06-28页面自动跳转
  7. 文件上传漏洞(寒假)
  8. 标贝科技声音克隆技术赋能 定制语音功能让陪伴触手可及
  9. Nature封面论文撤稿闹大了,认定首个室温超导体数据存疑!领域大佬尝试复现6次全失败,9位作者集体抗议无效...
  10. 个人以及企业用户如何选择合适的阿里云服务器?