Python实时解析日志文件,在日志旋转时重新加载

时间:2016-03-31 07:50:17

标签: python

我有这个代码,它不断地跟踪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)

2 个答案:

答案 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)

  • 当日志文件稍后可能有更多行时,您应该处理EOF的追赶。
  • 您可以添加信号处理程序以关闭代码并再次打开文件,例如通过logrotate执行(在RHEL上)
  • 如果您无法发信号通知此日志处理器,则可以检查文件的inode。如果您的日志旋转不是复制&amp;截断。

类似于此,请检查所有必要的异常处理。这是我的工作系统的部分副本:

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