今天有个需求,需要实时监控nginx日志中某些ip的访问情况。如果ip较少的话,直接使用tail、grep以及管道配合即可。不过需要监控100个左右的ip并进行相应处理的话,除了自己写脚本还真没想到别的办法。

首先引出Python中自带的2个函数:

  1. file.seek(off, whence=0) 从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动。如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。
  2. file.tell() 返回文件指针的当前位置。

那么思路就比较清晰了,写一个死循环,循环内记录指针位置并赋值给seek函数:

1
2
3
4
5
6
7
8
9
10
with open("test.txt") as f:
f.seek(0,2) #把指针置尾
while 1:
cp = f.tell() #获取当前位置
#print cp
line = f.readline()
if line:
print line
else:
f.seek(cp)#将指针移动到本次循环的位置

一个简单的模拟tail命令的脚本就完成了,然后在github上发现这么一个程序,原理上都一样,不过作者对其进行了更好的封装:https://github.com/kasun/python-tail

另外在python2.7中while 1的效率比while True的高。