思路历程:

  • 一开始以为小小的tailf命令功能很容易实现
  • 可是真到动手写的时候,还是迷糊了好一会。
  • 到找到一点思路,又掉进代threading.Condition的坑
  • 最后是中间的逻辑,有点绕

功能:

  • 就是一个python版本的tailf

有待扩展:

  • 暂时不支持Ctrl+C结束进程
  • 暂时没有实现监控多个文件及发送到kafka或者logstash

直接上代码:

#!/usr/bin/env python
#coding:utf-8"""
实现思想:
用两个线程:线程1用来读取日志文件,并记录读取位置线程2用发送日条目两个线程之间使用多线程的条件进行控制多个文件时,可以使用pyinotify,真正的可以实现filebeat功能
# from pyinotify import WatchManager,Notifier,ProcessEvent,IN_MODIFY,IN_DELETE
# pyinotify用法略
"""import os,sys
import threading
import timeclass argvError(Exception):pass# 初始化两个全局变量
ret_lines = []
pos = 0# 发送数据线程,可以自己实现发送到kafka/logstash
def Return(cond):with cond:while True:cond.wait()global ret_linesif len(ret_lines) >= 1:for line in ret_lines:print(line.strip())cond.notify()# 模拟tailf -n参数,当然此脚本是用argv,因此直接指定数字即可
def readFirst(file_path, unit=200, n = 10):while True:ret = []with open(file_path, "r") as f:f.seek(0, 2)start_pos = f.tell()global pospos = start_posmy_offset = unit * nif start_pos - my_offset <= 0:dest_pos = 0else:dest_pos = start_pos - my_offsetf.seek(dest_pos, 0)# print(dest_pos)while True:line = f.readline()if line:ret.append(line)else:breakf.seek(start_pos, 0)# 判断获取日志行数是否满足,不满足加大unit,继续循环if len(ret) > n:breakelif len(ret) <= n and dest_pos == 0:breakelif len(ret) <= n and dest_pos != 0:unit += unitcontinuereturn ret# 实时追踪新日志条目
def readContinue(file_path):start_time = time.time()global ret_linesret_lines = []while True:with open(file_path,"r") as f:global posf.seek(pos,0)while True:line = f.readline()if line:cur_pos = f.tell()pos = cur_posret_lines.append(line)elif not line:breakmiddle_time = time.time()if middle_time - start_time > 1 or len(ret_lines) >= 5:breakelse:time.sleep(0.3)continue# 实现tailf的线程
def Tailf(cond,file_path,n=10):with cond:while True:global posif pos == 0:unit = 200ret = readFirst(file_path,unit, n)global ret_linesif len(ret) > n:ret_lines = ret[-n::]else:ret_lines = retelse:readContinue(file_path)cond.notify()cond.wait()def main(file_path,n=10):cond = threading.Condition()# 这里有个大坑,t1和t2启动顺序,应该是wait()的一方先启动,类似socker server端# 而notify应该后启动.如果notify先启动,会阻塞,并不会报错,后面的顺序也就没办法继续了t1 = threading.Thread(target=Return,args=(cond,))t1.start()t2 = threading.Thread(target=Tailf,args=(cond,file_path,n))t2.start()# t1.join()# t2.join()time.sleep(1800)  # 发现Ctrl+c无法结束此程序,因此加一个超时时间if __name__ == "__main__":if len(sys.argv) < 2:raise argvError("请指定tailf文件对象")elif len(sys.argv) == 2:if os.path.isfile(sys.argv[1]):main(file_path=sys.argv[1])else:raise argvError("文件不存在")elif len(sys.argv) == 3:try:line = int(sys.argv[1])except Exception as e:raise argvError("第一个参数是数字")if not os.path.isfile(sys.argv[2]):raise argvError("文件不存在")main(n=line,file_path = sys.argv[2])elif len(sys.argv) > 3:raise argvError("tailf一次只能监控一个文件")

python实现tailf或者filebeat功能相关推荐

  1. 新手必看:Python 3.8六大新功能

    2020-01-30 12:10:38 全文共2372字,预计学习时长7分钟 来源:Pexels IT业日新月异,落后的Python 2将在2020年逐渐被淘汰. 2019年,随着数据科学的兴起,Py ...

  2. 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...

    文章主要为大家详细介绍了python实现ftp文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!!! 本文实例为大家分享了python实现ftp文件传输的具体 ...

  3. python 功能 代码_让你的Python代码实现类型提示功能

    Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,但是与此同时IDE无法向静态类型语言那样分析代码,及时给我们相应的提示.为了解决这个问题,Python 3.6 新增了几个特性PE ...

  4. python可以实现哪些功能_Python学习究竟有多强大,Python代码能实现哪些功能

    Python究竟有多强大?Python代码能实现哪些功能?众所周知,Python入门简单.功能强大,是人工智能时代最佳的编程语言.但很多人好奇Python究竟有多强大,为什么那么受欢迎?下面就来给大家 ...

  5. python使用函数的优点-原来 Python 还有这些实用的功能和特点!

    原标题:原来 Python 还有这些实用的功能和特点! 在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些你应该 ...

  6. 前端学python有什么用-原来 Python 还有这些实用的功能和特点!

    在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些你应该了解的Python功能特色. 带任意数量参数的函数 你可 ...

  7. python有哪些作用-python是什么 特点及功能

    随着信息时代的发展,计算机行业的就业前景相当不错,通过了解,最近有很多小伙伴打算学习python,那么python是什么?它的特点和功能有哪些呢?相关内容如下,赶快来了解吧! python是什么 Py ...

  8. python语言必背代码-让你的Python代码实现类型提示功能

    Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,但是与此同时IDE无法向静态类型语言那样分析代码,及时给我们相应的提示.为了解决这个问题,Python 3.6 新增了几个特性PE ...

  9. 文件不能断点 webstorm_详解python使用金山词霸的翻译功能(调试工具断点的使用)...

    这篇文章主要介绍了详解python使用金山词霸的翻译功能(调试工具断点的使用),本文给大家介绍得非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 今天试着用python获取金山 ...

最新文章

  1. AWS计算云上下载代码命令 git clone url
  2. freertos 创建互斥量_STM32CubeMX+FreeRTOS学习[6] 互斥量(Lu)
  3. Jekyll 使用入门
  4. 正在导出系统过程对象和操作 卡住_开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程
  5. webpack打包样式代码去重
  6. defun 函数定义
  7. 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子
  8. android contentprovider 生命周期,ContentProvider销毁/生命周期
  9. 搜狐的本色和张朝阳的本分
  10. 几种通信方式的介绍及详解
  11. 15软件班安卓课程实训总结
  12. 解决每次打开office都提示windows正在配置visio的问题以及office2013闪退问题
  13. 如何修改网卡的MAC地址?
  14. 继续理解socekt具体使用--2
  15. 活法:提升心性,磨炼灵魂——稻盛和夫
  16. 「BJOI 2019」排兵布阵
  17. 设计模式笔记-----七大原则
  18. 圆锥曲线万能弦长公式_圆锥曲线的弦长公式及其推导过程
  19. 第六次网页前端培训笔记(JavaScript)
  20. 为什么我建议你卸载“抖音”?

热门文章

  1. dell戴尔手机详细评测_拆机_root刷机
  2. 济南阳光社保微信公共帐号开通
  3. 根据电商法要求,微店平台的商户必须要执照,如何快速办理微店营业执照,看这里。
  4. LeetCode-126.单词接龙II(相关话题:Dijkstra算法+深度优先)
  5. TP4582B/TP4584B蓝牙充电座锂电池充放电芯片
  6. 使用adb命令将手机上的文件传输至电脑
  7. dedecms教程:Nginx验证码不显示解决方法
  8. iOS直播技术分析与实现
  9. excel:对带单位的数据进行计算(相乘、求和)
  10. 苹果隐藏应用_苹果备忘录你还没用过吗?千万别再浪费了