Tail -f in python, truncate aware
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
import time 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 example
tail = LogTail("/var/log/messages") 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.