tailhelper.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. class TailHelper:
  2. MAX_BUFFSIZE = 1024 * 1024
  3. def __init__(self, fname):
  4. self.f = open(fname, 'r')
  5. def tailf(self, size):
  6. sz, lines = self.tail(size)
  7. for line in lines:
  8. sys.stdout.write(line)
  9. sys.stdout.flush()
  10. while 1:
  11. newsz = self.fsize()
  12. bytes_added = newsz - sz
  13. if bytes_added < 0:
  14. sz = 0
  15. print "==> File truncated <=="
  16. bytes_added = newsz
  17. if bytes_added > 0:
  18. self.f.seek(-bytes_added, 2)
  19. bytes = self.f.read(bytes_added)
  20. sys.stdout.write(bytes)
  21. sys.stdout.flush()
  22. sz = newsz
  23. time.sleep(1)
  24. def tail(self, max=10):
  25. self.f.seek(0, 2)
  26. pos = sz = self.f.tell()
  27. lines = []
  28. bytes = []
  29. num_bytes = 0
  30. while 1:
  31. if pos == 0:
  32. break
  33. self.f.seek(pos)
  34. byte = self.f.read(1)
  35. if byte == '\n':
  36. if len(lines) == max:
  37. break
  38. bytes.reverse()
  39. line = ''.join(bytes)
  40. line and lines.append(line)
  41. bytes = []
  42. bytes.append(byte)
  43. num_bytes = num_bytes + 1
  44. if num_bytes > self.MAX_BUFFSIZE:
  45. break
  46. pos = pos - 1
  47. lines.reverse()
  48. return sz, lines
  49. def fsize(self):
  50. return os.fstat(self.f.fileno())[stat.ST_SIZE]