def run(self): if self.__move_on_EOF: self.__fd = TextFileReader(self.__file['filepath'], position=self.__startposition, moveinfo=self.__file.get('moveoneof')) else: self.__fd = RotatableFileReader(self.__file['filepath'], position=self.__startposition) while 1: if self.__shutdown: break line = self.__fd.getLine() if line == '' or line == '\0': gevent.sleep(SLEEP_TIME) continue #TODO: handle queue full self.__logQueue.put((self.__file['processor'], line))
class FileWatcher(gevent.Greenlet): def __init__(self, file, logQueue): self.__file = file self.__startposition = START_FROM_END if file.get('startposition') == 'top': self.__startposition = START_FROM_TOP self.__move_on_EOF = False if file.get('moveoneof'): self.__move_on_EOF = True self.__shutdown = False self.__logQueue = logQueue gevent.Greenlet.__init__(self) def get_file(self): return self.__file def run(self): if self.__move_on_EOF: self.__fd = TextFileReader(self.__file['filepath'], position=self.__startposition, moveinfo=self.__file.get('moveoneof')) else: self.__fd = RotatableFileReader(self.__file['filepath'], position=self.__startposition) while 1: if self.__shutdown: break line = self.__fd.getLine() if line == '' or line == '\0': gevent.sleep(SLEEP_TIME) continue #TODO: handle queue full self.__logQueue.put((self.__file['processor'], line)) def shutdown(self): self.__shutdown = True
def __construct_rotatable_file(self, position = -1 ): self.rotatable_file = RotatableFileReader(filepath = TEST_LOG_FILE, position=position) self.rotatable_file.open()
class test_rotatable_file(unittest.TestCase): def test_can_pass_filename(self): self.assertEqual(TEST_LOG_FILE, self.rotatable_file.getFilePath()) def test_can_tail_one_line(self): self.__insert_one_line(LINE_ONE) line = self.rotatable_file.getLine() self.assertEqual(LINE_ONE, line) def test_can_tail_two_lines(self): self.__insert_one_line(LINE_ONE) line_one = self.rotatable_file.getLine() self.assertEqual(LINE_ONE, line_one) self.__insert_one_line(LINE_TWO) line_two = self.rotatable_file.getLine() self.assertEqual(LINE_TWO, line_two) def test_can_tail_when_rotate(self): self.__insert_one_line(LINE_ONE) line_one = self.rotatable_file.getLine() self.assertEqual(LINE_ONE, line_one) self.__rotate_test_file() self.__insert_one_line(LINE_TWO) line_two = self.rotatable_file.getLine() self.assertEqual(LINE_TWO, line_two) def test_is_starts_from_bottom(self): self.__insert_one_line(LINE_ONE) self.__construct_rotatable_file() self.__insert_one_line(LINE_TWO) line = self.rotatable_file.getLine() self.assertEqual(LINE_TWO, line) def test_read_from_0_position(self): self.__insert_one_line(LINE_ONE) self.__insert_one_line(LINE_TWO) self.__construct_rotatable_file(position=0) line_one = self.rotatable_file.getLine() second_line = self.rotatable_file.getLine() self.assertEqual(line_one, LINE_ONE) self.assertEqual(second_line, LINE_TWO) def setUp(self): self.__open_test_file() self.__construct_rotatable_file() def tearDown(self): test_helper.tearDown() def __construct_rotatable_file(self, position = -1 ): self.rotatable_file = RotatableFileReader(filepath = TEST_LOG_FILE, position=position) self.rotatable_file.open() def __insert_one_line(self, line): self.test_file.write(line + END_LINE) self.test_file.flush() def __rotate_test_file(self): self.test_file.close() os.remove(TEST_LOG_FILE) self.__open_test_file() def __open_test_file(self): self.test_file = open(TEST_LOG_FILE,"w")