Monitoring a Log File
From CodeCodex
There is frequently a need to scan system or application log files for notifications of particular events and the like. There are some subtle points about reading from a file that another process is actively writing to:
- When you reach the current end of the file, some more content may be appended a few seconds or a few minutes later. Thus, you need to wait a while and then try to resume reading from the current position. This requires clearing the EOF indication without closing and reopening the file.
- Many systems implement logfile rollover, where periodically the current log file is closed and renamed, and a new log file opened with the previous name. This is to keep the log files from growing without bounds.
Some Python code that handles both these issues is as follows:
LogFileName = "/var/log/messages" # or whatever log file you're wanting to monitor
MonitorInterval = 60 # number of seconds between checks for new content
LogFile = None # to begin with
while True :
if LogFile == None :
LogFile = open(LogFileName, "r")
#end if
while True :
Line = LogFile.readline()
if Line == "" :
break # end of file reached
#end if
... do whatever processing of Line is necessary ...
#end while
if \
os.path.realpath("/proc/self/fd/%d" % LogFile.fileno()) \
!= \
os.path.realpath(LogFileName) \
:
# rollover has started, might still be in progress
LogFile.close()
LogFile = None
else :
LogFile.seek(0, 1) # clear EOF state
#end if
time.sleep(MonitorInterval)
# wait for more content, also gives time for rollover to complete
#end while
Note that the check whether the log file still has the same name is reliant on the functionality of procfs under Linux—will this work under any other systems?

