【问题标题】:Python issue with tracking continuously updated log file跟踪不断更新的日志文件的 Python 问题
【发布时间】:2015-10-15 09:32:25
【问题描述】:

我正在尝试跟踪另一个正在运行的程序正在创建的日志文件。如果在更新的日志中找到单词“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 返回相同的东西,并且当日志确实仍在更新时总是返回 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 时效果很好。

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

【问题讨论】:

标签: python logging tracking seek tell


【解决方案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")

【讨论】:

  • 您好,感谢您的回复。对于我所收集的信息 - 如果程序正常完成(并返回一个空字符串),则此方法有效,但如果程序长时间挂在一条线上,则此方法无效。理想情况下,如果程序在同一行上挂得太久(因此需要中止),我想添加另一个返回 false 的功能。再次感谢。
  • 只需给它们添加一个计数器,如果readline连续指定次数返回空,则声明它失败。我已经更新了上面的示例以反映这一点。
  • 太好了,这就是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多