小弟想在web上显示log文件的最新的五十条,遇到这个问题,希望大家帮帮忙。不甚感激。
几种方式:
用subprocess调tail -f
用pyinotiy监听文件变化
自己实现,比如先拿到文件大小,读到最后一个字节,然后往回退到第一个n,这就是倒数第一行了,然后依次往回退
楼上几位说的都可行, 不过 @nealnote 的方法如果读大文件会有性能问题, 建议用 @manong 所说, subprocess
调unix
系统自带的一个tail
程序去做, 具体实现如下:
import subprocess
fh = subprocess.Popen("tail -n 50 /var/log/dmesg", stdout=subprocess.PIPE, shell=True)
for line in fh.stdout.readlines():
print(line.decode('ascii'), end="")
运行结果:
...
...
rdac: device handler registered
device-mapper: multipath round-robin: version 1.0.0 loaded
EXT4-fs (sdd5): mounted filesystem with ordered data mode. Opts:
EXT4-fs (sdd2): mounted filesystem with ordered data mode. Opts:
EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts:
EXT4-fs (dm-0): warning: maximal mount count reached, running e2fsck is recommended
EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts:
Adding 1023996k swap on /dev/sdd3. Priority:-1 extents:1 across:1023996k
https://codeplot.top/index.ph... 1. 使用os.path.getsize 获取文件大小
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
def tail_read(f, n):
cur_pos = f.tell()
buf = b''
while n:
b = f.read(1)
buf = b + buf
cur_pos -= 1
if cur_pos < 0: break
f.seek(cur_pos)
n -= 1
return buf
def tail_open(file):
fsize = os.path.getsize(file)
f = open(file, 'rb')
f.seek(fsize - 1)
return f
if __name__ == '__main__':
import sys
f = tail_open(sys.argv[1])
buf = tail_read(f, int(sys.argv[2]))
print (buf)
7 回答5.3k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
4 回答3.8k 阅读✓ 已解决
2 回答5.9k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
file.readlines()[-50:]