美文网首页
python实现文件增量内容扫描(类似shell中的tail指令

python实现文件增量内容扫描(类似shell中的tail指令

作者: funOfFan | 来源:发表于2021-05-21 11:40 被阅读0次
import time
import pickle
import  os
log_file = "/var/log/syslog"
refer_file = "/home/fmr/log-scan.refer.temp"
def _get_refer(p_refer_file):
    '''
    @param: 
    p_refer_file    存放last scan的mtime、position的临时文件
    
    @function 
    从指定的refer file中,读取其中存放的refer字典
    
    @return
    a dictionary like {'time': xxxxx , 'position':xxxxx}
    '''
    refer_file = p_refer_file
    refer = {'time':time.time(), 'position':0}
    if os.path.exists(refer_file):
        with open(refer_file, 'rb') as referd:
            try:
                refer = pickle.load(referd)
            except:
                pass
    #print(refer)
    return refer

def _update_refer(p_refer,p_refer_file):
    '''
    @funciton
    1. 将输入的refer序列化
    2. 将序列化后的refer dict写入指定临时文件
    
    @param
    p_refer:           包含time、position的一个dict
    p_refer_file:  存放序列化后的dict的临时文件
    '''
    refer = p_refer
    refer_file = p_refer_file
    with open(refer_file,'wb') as referd:
        pickle.dump(refer, referd)

_update_refer({'time':time.time(), 'position':0}, refer_file) 
while(True):
    refer = _get_refer(refer_file )
    file_mtime = os.path.getmtime(log_file)
    if file_mtime <= refer['time']:
        #print("file mtime did not change since last scan")
        refer['time'] = file_mtime
        _update_refer(refer,refer_file)
        continue
    file_size = os.path.getsize(log_file)
    if file_size <= refer['position']:
        #print("file size did not change since last scan")
        refer['position'] = file_size
        _update_refer(refer,refer_file)
        continue
    
    print("the file has changed , start to scan")
    with open(log_file) as logfd:
        logfd.seek(refer['position'], os.SEEK_SET)
        #for line in logfd.readline():
            #print(line)
        line = logfd.readline()
        while(line):
            print(line)
            #此处将读取到的每行数据上传至TDengine即可
            line = logfd.readline()
        refer = {'time':time.time(), 'position':logfd.tell()}
        _update_refer(refer, refer_file)
        

相关文章

  • python实现文件增量内容扫描(类似shell中的tail指令

  • Python实现linux的tail功能

    基于python3,简单实现tail -n、tail -f功能 原理 把文件大小分页进行读取,这样读取大日志就无需...

  • Python3 提升你脚本的逼格系列(二)

    通过文件名查找文件 有时候,你不想在 Python 脚本中调用 shell,或者你要实现一些 shell 不能做的...

  • 11.1学习总结

    今天我们学习了文件内容显示的一些指令,cat、more、less、head、tail等。还学习了创建链接文件,有...

  • 文件操作

    Python基础教程 文件内容操作 python中的文件操作还是挺简单的,类似于php中的文件方法,精简好用。我们...

  • shell(四)

    Shell echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。...

  • shell echo命令

    Shell echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。...

  • Linux第一天

    Linux第一天 linux目录 Shell指令 就是Linux指令 常用的shell指令 目录 删除 查看文件 ...

  • 常用ADB指令总结

    1 常用Linus文件操作指令: 2 adb相关指令 adb shell指令 adb shell是指从PC进入目标...

  • 批量转换文件编码GBK to utf-8

    find + iconv的组合会强制给文件添加.cpp.cpp类似的后缀,所以组合mv指令 ,放在shell脚本里...

网友评论

      本文标题:python实现文件增量内容扫描(类似shell中的tail指令

      本文链接:https://www.haomeiwen.com/subject/wuhwjltx.html