Skip to content

Instantly share code, notes, and snippets.

@alexzhan
Created August 22, 2015 17:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexzhan/62f33e98b7e7a8d49392 to your computer and use it in GitHub Desktop.
Save alexzhan/62f33e98b7e7a8d49392 to your computer and use it in GitHub Desktop.
import os
import string
RCV_LOG = r"/path/to/xxx.log"
def get_last_n_lines(logfile, n):
n = string.atoi(n)
blk_size_max = 4096
n_lines = []
with open(logfile, 'rb') as fp:
fp.seek(0, os.SEEK_END)
cur_pos = fp.tell()
while cur_pos > 0 and len(n_lines) < n:
blk_size = min(blk_size_max, cur_pos)
fp.seek(cur_pos - blk_size, os.SEEK_SET)
blk_data = fp.read(blk_size)
assert len(blk_data) == blk_size
lines = blk_data.split('\n')
# adjust cur_pos
if len(lines) > 1 and len(lines[0]) > 0:
n_lines[0:0] = lines[1:]
cur_pos -= (blk_size - len(lines[0]))
else:
n_lines[0:0] = lines
cur_pos -= blk_size
fp.seek(cur_pos, os.SEEK_SET)
if len(n_lines) > 0 and len(n_lines[-1]) == 0:
del n_lines[-1]
return n_lines[-n:]
if __name__ == '__main__':
print get_last_n_lines(RCV_LOG, "5")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment