python 实现 linux tailf 功能

python 实时输出日志文本信息:

#!/usr/bin/python
# -*- coding:utf-8 -*-

import time

class file_read:
    def __init__(self, logname):
        self.logname = logname

    def file_readlines(self, line):
        print line,

    def file_readline(self):
        f = open(self.logname, 'r')
        f.seek(0, 2)

        while True:
            offset = f.tell()
            line = f.readline()
            if not line:
                f.seek(offset)
                time.sleep(3)
            else:
                self.file_readlines(line)
        f.close()

if __name__ == '__main__':
    a = file_read('./file.txt')
    a.file_readline()

由于每天会通过 logrotate 进行日志切割,而切割完之后即使新建一个name相同的文件,那么程序还是需要再跑一遍

下面的程序主要通过 before_time 和 after_time 以及 offset 的判断,如果 offset 偏移值相同,而 time 发生变化的话说明文件已经被切割,从而 f.close() 并且 open 重新打开文件。

#!/usr/bin/python
# -*- coding:utf-8 -*-

import os.path
import time

class file_read:
    def __init__(self, logname):
        self.logname = logname

    def get_time(self, logname):    # get_time 函数用来获取时间
        if os.path.exists(logname):
            return time.ctime(os.path.getctime(logname))
        else:                       # 如果logname不存在,则输出提示信息,并且重新执行(self.get_time(logname))获取时间,直到获取到log为止
            print str(logname) + 'is not exists'
            time.sleep(1)
            self.get_time(logname)  

    def file_readlines(self, line): # 定义行输出函数
        print line,

    def file_readline(self):
        if not os.path.exists(self.logname):
            print str(self.logname) + 'is not exists'
            time.sleep(1)
            self.file_readline()   # 如果logname不存在,则接着执行该函数self.file_readline()

        f = open(self.logname)                       # 打开日志文件
        f.seek(0, 2)                                 # 移动到文件尾部
        while True:
            before_ctime = self.get_time(self.logname)   # 获取之前的时间
            before_offset = f.tell()                     # 获取之前的偏移值
            line = f.readline()                          # 获取新行

            if not line:                                 # 判断新行是否获取成功,如果没有获取成功,则获取之后的时间和偏移值
                after_ctime = self.get_time(self.logname)
                after_offset = f.tell()
                # 判断在文件偏移值没有变化的情况下,ctime时间是否相同,如果不同,则表示文件被切割,重新打开并读取内容
                if before_ctime != after_ctime and before_offset == after_offset and os.path.exists(self.logname):
                    f.close()
                    f = open(self.logname, 'r')
                    line = f.readline()
                    self.file_readlines(line)
            else:
                self.file_readlines(line)                # 如果有获取到新行,则进行打印
        f.close()

if __name__ == '__main__':
    a = file_read('./file.txt')
    a.file_readline()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值