实时读取日志信息

yield版本的tail -f

import time


def follow(thefile):
    thefile.seek(0,2)      # 备注1
    while True:
         line = thefile.readline()
         if not line:
             time.sleep(0.1)    # 备注2
             continue
         yield line


# Example use
if __name__ == '__main__':
    logfile = open("/var/log/message")
    for line in follow(logfile):
        print line,

备注1: seek函数有两个参数

           第一个参数: 表示从当前行的第x字符开始读取到该行的最后一个字符, 例如填写0则表示从第0个字符开始读取一直到该行的最后一个字符;  如果填写10则表示从当前行的第十个字符开始读取到当前行的最后一个字符.

           第二个参数: 有三个值, 0表示从文件第一行开始读取, 1表示从接着上次的位置开始读取, 2表示从文件的最后一行开始读取.


备注2: 通过利用time.sleep, 让程序进入休眠状态, 避免io读写过于凶猛.



其他版本的tail -f(没有yield)

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'

import time


def follow(thefile):
    thefile.seek(0, 2)
    while True:
        current_position = thefile.tell()      # 备注3
        line = thefile.readline()
        if line:
            print line
        else:
            thefile.seek(current_position)     # 备注4
            time.sleep(0.1)

if __name__ == '__main__':
    logfile = open('/var/log/message')
    follow(logfile)


备注3: 利用tell将当前所在的位置, 如果没有读取到新的数据则会结合seek(current_position)持续锁定当前位置.


参考资料: http://www.dabeaz.com/coroutines/index.html

转载于:https://my.oschina.net/zhengtong0898/blog/662773

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值