python 实时输出日志文本信息:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import time
class file_read:
def __init__(self, logname):
self.logname = logname
def file_readlines(self, line):
print line,
def file_readline(self):
f = open(self.logname, 'r')
f.seek(0, 2)
while True:
offset = f.tell()
line = f.readline()
if not line:
f.seek(offset)
time.sleep(3)
else:
self.file_readlines(line)
f.close()
if __name__ == '__main__':
a = file_read('./file.txt')
a.file_readline()
由于每天会通过 logrotate 进行日志切割,而切割完之后即使新建一个name相同的文件,那么程序还是需要再跑一遍
下面的程序主要通过 before_time 和 after_time 以及 offset 的判断,如果 offset 偏移值相同,而 time 发生变化的话说明文件已经被切割,从而 f.close() 并且 open 重新打开文件。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os.path
import time
class file_read:
def __init__(self, logname):
self.logname = logname
def get_time(self, logname): # get_time 函数用来获取时间
if os.path.exists(logname):
return time.ctime(os.path.getctime(logname))
else: # 如果logname不存在,则输出提示信息,并且重新执行(self.get_time(logname))获取时间,直到获取到log为止
print str(logname) + 'is not exists'
time.sleep(1)
self.get_time(logname)
def file_readlines(self, line): # 定义行输出函数
print line,
def file_readline(self):
if not os.path.exists(self.logname):
print str(self.logname) + 'is not exists'
time.sleep(1)
self.file_readline() # 如果logname不存在,则接着执行该函数self.file_readline()
f = open(self.logname) # 打开日志文件
f.seek(0, 2) # 移动到文件尾部
while True:
before_ctime = self.get_time(self.logname) # 获取之前的时间
before_offset = f.tell() # 获取之前的偏移值
line = f.readline() # 获取新行
if not line: # 判断新行是否获取成功,如果没有获取成功,则获取之后的时间和偏移值
after_ctime = self.get_time(self.logname)
after_offset = f.tell()
# 判断在文件偏移值没有变化的情况下,ctime时间是否相同,如果不同,则表示文件被切割,重新打开并读取内容
if before_ctime != after_ctime and before_offset == after_offset and os.path.exists(self.logname):
f.close()
f = open(self.logname, 'r')
line = f.readline()
self.file_readlines(line)
else:
self.file_readlines(line) # 如果有获取到新行,则进行打印
f.close()
if __name__ == '__main__':
a = file_read('./file.txt')
a.file_readline()