Tailing a log file?

Falcolas garrickp at gmail.com
Fri Jun 22 21:01:13 CEST 2007

On Jun 22, 12:50 pm, "Kenji Noguchi" <tokyo... at gmail.com> wrote:
> > I checked the source code for tail and they actually poll the file by
> > using fstat and sleep to check for changes in the file size. This
> > didn't seem right so I thought about it more and realized I ought to
> > be using inotify. So I guess I answered my own question.

I built something which worked on the "check stat and sleep" method.
Using notify or select may work, but it's not portible to Windows
systems, which may or may not be an issue for you.

#! /usr/bin/env python

import os
import sys
import time
from stat import *

class Watchfile(object):

    def __init__(self, f_loc):

        self.file_loc = f_loc

        self.prev_lm = 0
        self.last_read_pos = 0

        f = open(self.file_loc, "r")
        for l in f:
        self.last_read_pos = f.tell()

        self.prev_lm = os.stat(self.file_loc)[ST_MTIME]

    def changed(self):

        lm_time = os.stat(self.file_loc)[ST_MTIME]

        if lm_time > self.prev_lm:
            return True
            return False

    def get_since_last_read(self):

        f = open(self.file_loc, "r")

        lines = f.readlines()
        self.last_read_pos = f.tell()


        self.prev_lm = os.stat(self.file_loc)[ST_MTIME]
        return lines

if __name__ == "__main__":
    x_file = Watchfile("<file path>")
    y_file   = Watchfile("<file path>")

    while True:

        if x_file.changed():

            lines = x_file.get_since_last_read()

            # do something

        if y_file.changed():

            lines = y_file.get_since_last_read()

            # do something else

        except KeyboardInterrupt:

More information about the Python-list mailing list