我有这个代码,它不断地跟踪access.log
并解析事件。但在日志轮换期间,access.log
将移至access.log.timestamp
,并且java进程将创建新的access.log
。当这个rejig发生时,python解析器不会解析新的access.log
。请帮助解决一些线索如何在程序更改时重新加载程序。
with open('/var/log/app/access.log') as f:
while True:
line = f.readline()
if line:
process(line)
答案 0 :(得分:3)
所以问题似乎是python文件指针在日志更改时保持其位置引用。所以我们要做的是检查文件的大小,当它小于我们将python文件指针重置为使用seek(0)开始即'0'之前。我还没有厌倦这段代码但你可以回复结果,所以我们可以修改它。
import os
file_path = '/var/log/app/access.log'
with open(file_path) as f:
file_size = 0
while True:
line = f.readline()
if line:
print line
file_status_obj = os.stat(file_path)
if file_size < file_status_obj.st_size:
f.seek(0)
file_size = file_status_obj.st_size
希望这会有所帮助:)
答案 1 :(得分:1)
类似于此,请检查所有必要的异常处理。这是我的工作系统的部分副本:
def iNodeOf(file):
if os.path.exists(file):
s = os.stat(file)
return s.st_ino
else:
return -1
while True:
iReload = False
fileInode = iNodeOf(conf.LOGFILE)
f = open(conf.LOGFILE, 'r')
countDown = 15
while (not iReload) and (countDown > 0):
# seek to current position again
f.seek(0,1)
while countDown > 0:
filePos = f.tell()
line = f.readline()
if line:
process(line)
countDown = 15
else:
countDown -= 1
time.sleep(1)
newInode = iNodeOf(conf.LOGFILE)
if (fileInode == newInode):
# file not changed, sleep, seek from BOF, and try again
time.sleep(5)
f.seek(filePos,0)
countDown = 15
else:
# file changed
f.close()
iReload = True