My solution would involve the seek and tell functions to resume every five minutes where you left off the last time. And a small file where you would store file position from tell() and the results of the last 5 chunks of 5(!) minutes of logfile you scanned (lets call them subresults).
The result of a 30 minutes check would then be the logical AND of the last 6 subresults (five from the file and one from the last scan) for the success line combined with the logical AND of the last 6 subresults for the non-zero value.
Hope I made sense.