Tail -f in python, truncate aware
So while doing a little coding I tried to find some tail -f class in python that will recognize when file that we tailing is been truncated. All I found was some tail -f classes that brakes on file truncate or rotate.
Eventually I came up with this:
from os import stat
from os.path import abspath
from stat import ST_SIZE
class LogTail:
def __init__(self, logfile):
self.logfile = abspath(logfile)
self.f = open(self.logfile,"r")
file_len = stat(self.logfile)[ST_SIZE]
self.f.seek(file_len)
self.pos = self.f.tell()
def _reset(self):
self.f.close()
self.f = open(self.logfile, "r")
self.pos = self.f.tell()
def tail(self):
while 1:
self.pos = self.f.tell()
line = self.f.readline()
if not line:
if stat(self.logfile)[ST_SIZE] < self.pos:
self._reset()
else:
time.sleep(1)
self.f.seek(self.pos)
else:
"""print, return or otherwise manipulate
the tailed line"""
print line
Maybe it’s a too much overhead to check each time for file size, but you get the general idea.
So anyways here’s a usage exampe:
tail.tail()
This will print out any new line appended to /var/log/messages file. If the file gets truncated or log rotated, class will detect it and will return to the start.
