def test_subsequent_read_with_new_data(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str) new_lines = "4\n5\n" self.append(new_lines) new_pygtail = Pygtail(self.logfile.name) self.assertEqual(new_pygtail.read(), new_lines)
def test_subsequent_read_with_new_data(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str) new_lines = "4\n5\n" self.append(new_lines) new_pygtail = Pygtail(self.logfile.name) self.assertEqual(new_pygtail.read(), new_lines)
def test_read_from_the_file_end(self): pygtail = Pygtail(self.logfile.name, read_from_end=True) self.assertEqual(pygtail.read(), None) new_lines = "4\n5\n" self.append(new_lines) new_pygtail = Pygtail(self.logfile.name, read_from_end=True) self.assertEqual(new_pygtail.read(), new_lines)
def test_logrotate_with_delay_compress(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) os.rename(self.logfile.name, "%s.1" % self.logfile.name) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_logrotate_without_close(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) # note it doesn't matter what filename the file gets rotated to os.rename(self.logfile.name, "%s.somethingodd" % self.logfile.name) self.append(new_lines[1]) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_timed_rotating_file_handler(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) os.rename(self.logfile.name, "%s.2016-06-16" % self.logfile.name) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_timed_rotating_file_handler(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) os.rename(self.logfile.name, "%s.2016-06-16" % self.logfile.name) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_logrotate(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) os.rename(self.logfile.name, "%s.1" % self.logfile.name) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEquals(pygtail.read(), "".join(new_lines))
def test_logrotate_with_dateext_with_delaycompress(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) os.rename(self.logfile.name, "%s-20160616" % self.logfile.name) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_copytruncate_off_smaller_without_close(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name, copytruncate=True) pygtail.read() self.append(new_lines[0]) read1 = pygtail.read() self.copytruncate() self.append(new_lines[1]) read2 = pygtail.read() self.assertEqual([read1,read2], new_lines)
def test_custom_rotating_file_handler_with_prepend(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) file_dir, rel_filename = os.path.split(self.logfile.name) os.rename(self.logfile.name, os.path.join(file_dir, "custom_log_pattern.%s" % rel_filename)) self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name, rotated_filename_patterns=["custom_log_pattern.%s"]) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_full_lines(self): """ Tests lines are logged only when they have a new line at the end. This is useful to ensure that log lines aren't unintentionally split up. """ pygtail = Pygtail(self.logfile.name, full_lines=True) new_lines = "4\n5," last_line = "5.5\n6\n" self.append(new_lines) pygtail.read() self.append(last_line) self.assertEqual(pygtail.read(), "5,5.5\n6\n")
def test_renamecreate(self): """ Tests "renamecreate" semantics where the currently processed file gets renamed and the original file gets recreated. This is the behavior of certain logfile rollers such as TimeBasedRollingPolicy in Java's Logback library. """ new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() os.rename(self.logfile.name, "%s.2018-03-10" % self.logfile.name) # append will recreate the original log file self.append(new_lines[0]) self.append(new_lines[1]) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_copytruncate_on_smaller(self): self.test_readlines() self.copytruncate() new_lines = "4\n5\n" self.append(new_lines) pygtail = Pygtail(self.logfile.name, copytruncate=True) self.assertEqual(pygtail.read(), new_lines)
def test_renamecreate_unknown_rotated_name(self): """ Tests "renamecreate" semantics where the currently processed file gets renamed and the original file gets recreated. Rolled file has unknown name to pygtail. logrotate from Linux has this behaviour when rotating into separate directory. """ new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() os.rename(self.logfile.name, "%s.unknown-name" % self.logfile.name) # append will recreate the original log file self.append(new_lines[0]) self.append(new_lines[1]) # reopen using Pytgail pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_copytruncate_on_smaller(self): self.test_readlines() self.copytruncate() new_lines = "4\n5\n" self.append(new_lines) pygtail = Pygtail(self.logfile.name, copytruncate=True) self.assertEqual(pygtail.read(), new_lines)
def test_copytruncate_off_smaller(self): self.test_readlines() self.copytruncate() new_lines = "4\n5\n" self.append(new_lines) pygtail = Pygtail(self.logfile.name, copytruncate=False) self.assertEqual(pygtail.read(), None) self.assertRegexpMatches(sys.stderr.getvalue(), r".*?\bWARN\b.*?\bshrank\b.*")
def _test_copytruncate_larger(self, onoff): self.test_readlines() self.copytruncate() self.append(self.test_str) new_lines = "4\n5\n" self.append(new_lines) pygtail = Pygtail(self.logfile.name, copytruncate=onoff) self.assertEqual(pygtail.read(), new_lines)
def _test_copytruncate_larger(self, onoff): self.test_readlines() self.copytruncate() self.append(self.test_str) new_lines = "4\n5\n" self.append(new_lines) pygtail = Pygtail(self.logfile.name, copytruncate=onoff) self.assertEqual(pygtail.read(), new_lines)
def test_logrotate_without_delay_compress(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) # put content to gzip file gzip_handle = gzip.open("%s.1.gz" % self.logfile.name, 'wb') with open(self.logfile.name, 'rb') as logfile: gzip_handle.write(logfile.read()) gzip_handle.close() with open(self.logfile.name, 'w'): # truncate file pass self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_logrotate_without_delay_compress(self): new_lines = ["4\n5\n", "6\n7\n"] pygtail = Pygtail(self.logfile.name) pygtail.read() self.append(new_lines[0]) # put content to gzip file gzip_handle = gzip.open("%s.1.gz" % self.logfile.name, 'wb') with open(self.logfile.name, 'rb') as logfile: gzip_handle.write(logfile.read()) gzip_handle.close() with open(self.logfile.name, 'w'): # truncate file pass self.append(new_lines[1]) pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), ''.join(new_lines))
def test_copytruncate_off_smaller(self): self.test_readlines() self.copytruncate() new_lines = "4\n5\n" self.append(new_lines) sys.stderr = captured = io.BytesIO() if PY2 else io.StringIO() pygtail = Pygtail(self.logfile.name, copytruncate=False) captured_value = captured.getvalue() sys.stderr = sys.__stderr__ self.assertRegexpMatches(captured_value, r".*?\bWARN\b.*?\bshrank\b.*") self.assertEqual(pygtail.read(), None)
def test_copytruncate_off_smaller(self): self.test_readlines() self.copytruncate() new_lines = "4\n5\n" self.append(new_lines) sys.stderr = captured = io.BytesIO() if PY2 else io.StringIO() pygtail = Pygtail(self.logfile.name, copytruncate=False) captured_value = captured.getvalue() sys.stderr = sys.__stderr__ assert_class = self.assertRegex if sys.version_info >= (3, 1) else self.assertRegexpMatches assert_class(captured_value, r".*?\bWARN\b.*?\bshrank\b.*") self.assertEqual(pygtail.read(), None)
def on_modified(self, event): super(TailContentCollector, self).on_modified(event) # what = 'directory' if event.is_directory else 'file' # logging.info("Modified %s: %s", what, event.src_path) # split_path = None log_file = event.src_path.split("/") # prepare offset file directory if not os.path.exists(self.offset_dir): os.makedirs(self.offset_dir) offset_file = "%s/%s.os" % (self.offset_dir, log_file[-1]) # offset file must separate with monitor directory, and is local variable... tailor = Pygtail(event.src_path, offset_file, paranoid=True) appended = tailor.read() if appended: # must use gbk decoding... decodelines = appended.decode("gbk") # execute callback function... self.onchange(event.src_path, decodelines) else: logging.info("empty content: %s", event.src_path)
def test_read(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str)
def test_subsequent_read_with_no_new_data(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str) self.assertEqual(pygtail.read(), None)
def test_read(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str)
def test_subsequent_read_with_no_new_data(self): pygtail = Pygtail(self.logfile.name) self.assertEqual(pygtail.read(), self.test_str) self.assertEqual(pygtail.read(), None)