Python问题跟踪不断更新的日志文件

时间:2015-07-24 16:07:53

标签: python logging tracking seek tell

我正在尝试跟踪由另一个正在运行的程序创建的日志文件。如果在更新的日志中找到“day”这个词,那么我想返回True(这意味着其他代码已成功运行)。问题是 - 有时其他程序不成功,只是卡在同一行,如果发生这种情况我想返回false。我已经尝试跟踪它是否使用seek()和tell()这样卡在同一行:

def is_successful_test(self):
    '''
    checks if external code was successful
    '''
    day_out = os.path.join(self.working_dir, 'day.out')
    day_out = open(day_out)
    i = 0

    while True:
            day_out.seek(i)
            latest_line = day_out.readline()
            i_old = dat_out.tell()
            if 'day' in latest_line:
                    return True
            time.sleep(60)
            i = aims_out.tell()
            if i == i_old:
                    self.output("day file not updating")
                    break
    return False

但是这总是为i和i_old返回相同的东西,并且当log确实仍然在更新时总是返回false(我可能没有正确地做它我是新手)。当我试图跟踪文件的大小时(使用os.stat),它也返回了同样的东西。

我也试过用,

def is_successful(self):
    '''
    checks if external code was successful
    '''
    day_out = os.path.join(self.working_dir, 'day.out')
    day_out = open(day_out,"r")
    while True:
            line = day_out.readline()
            if line == '':
                    break
            if 'day' in line:
                    day_out.close()
                    return True
    day_out.close()
    return False

适用于其他程序运行速度非常快但似乎有点超时但如果代码运行时间过长则返回false。

我有点难以理解为什么我找不到一致的解决方案。跟踪文件的大小或行甚至时差似乎是一个好主意,但我似乎无法实现它。我想找到最简单的解决方案而不下载像看门狗这样我在其他帖子中看到的东西。任何帮助,将不胜感激!感谢。

1 个答案:

答案 0 :(得分:1)

您试图以无意义的方式使用seektelltell只返回当前打开文件中位置的偏移量(在当前进程中) ) - 如果文件在其他进程中再次打开并且openfile的实例位于另一个位置,则不会返回不同的数字。 除非在调用tell之前发出seek,要求将光标放在文件的末尾:day_out.seek(0, OS.SEEK_END)。但是你的想法太复杂了,也无法发挥作用。

对于你想要的,你可以继续在你的文件上发出readline:如果你在文件的末尾,你会得到一个空字符串。如果其他进程已从光标所在的位置写入额外的行,则将检索下一行。

counter = 0
while True:
   line = day_out.readline()
   if "day" in line:
      do_things()
      counter = 0
   elif line == '':
      time.sleep(60)
      counter += 1
   if counter > 5:
       output("day file not updating")