From c9e8a1fc52e148ca165df4982164aba249b60ba1 Mon Sep 17 00:00:00 2001 From: kyle Date: Sun, 11 Feb 2018 10:50:04 +0800 Subject: [PATCH] file rotate detect --- src/tailer/__init__.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/tailer/__init__.py b/src/tailer/__init__.py index 1f8c1e1..1419208 100644 --- a/src/tailer/__init__.py +++ b/src/tailer/__init__.py @@ -1,6 +1,7 @@ import re import sys import time +import os if sys.version_info < (3,): range = xrange @@ -15,6 +16,7 @@ class Tailer(object): def __init__(self, file, read_size=1024, end=False): self.read_size = read_size self.file = file + self.cur_file_ino = os.fstat(self.file.fileno()).st_ino self.start_pos = self.file.tell() if end: self.seek_end() @@ -150,6 +152,14 @@ def head(self, lines=10): else: return [] + def _check_rotate(self): + if os.stat(self.file.name).st_ino != self.cur_file_ino: + new = open(self.file.name, "r") + self.file.close() + self.file = new + self.file.seek(0, 2) + self.cur_file_ino = os.fstat(self.file.fileno()).st_ino + def follow(self, delay=1.0): """\ Iterator generator that returns lines as data is added to the file. @@ -180,6 +190,7 @@ def follow(self, delay=1.0): trailing = True self.seek(where) time.sleep(delay) + self._check_rotate() def __iter__(self): return self.follow()