docs: def watch_log_for(self, exprs, from_mark=None, timeout=600, process=None, verbose=False, filename='system.log'):
          """
          Watch the log until one or more (regular) expression are found.
          This methods when all the expressions have been found or the method
          timeouts (a TimeoutError is then raised). On successful completion,
          a list of pair (line matched, match object) is returned.
          """
          start = time.time()
          tofind = [exprs] if isinstance(exprs, string_types) else exprs
          tofind = [re.compile(e) for e in tofind]
          matchings = []
          reads = ""
          if len(tofind) == 0:
              return None
  
          log_file = os.path.join(self.get_path(), 'logs', filename)
          output_read = False
          while not os.path.exists(log_file):
              time.sleep(.5)
              if start + timeout < time.time():
                  raise TimeoutError(time.strftime("%d %b %Y %H:%M:%S", time.gmtime()) + " [" + self.name + "] Timed out waiting for {} to be created.".format(log_file))
              if process and not output_read:
                  process.poll()
                  if process.returncode is not None:
                      self.print_process_output(self.name, process, verbose)
                      output_read = True
                      if process.returncode != 0:
                          raise RuntimeError()  # Shouldn't reuse RuntimeError but I'm lazy
  
          with open(log_file) as f:
              if from_mark:
                  f.seek(from_mark)
  
              while True:
                  # First, if we have a process to check, then check it.
                  # Skip on Windows - stdout/stderr is cassandra.bat
                  if not common.is_win() and not output_read:
                      if process:
                          process.poll()
                          if process.returncode is not None:
                              self.print_process_output(self.name, process, verbose)
                              output_read = True
                              if process.returncode != 0:
                                  raise RuntimeError()  # Shouldn't reuse RuntimeError but I'm lazy
  
                  line = f.readline()
                  if line:
                      reads = reads + line
                      for e in tofind:
                          m = e.search(line)
                          if m:
                              matchings.append((line, m))
                              tofind.remove(e)
                              if len(tofind) == 0:
                                  return matchings[0] if isinstance(exprs, string_types) else matchings
                  else:
                      # yep, it's ugly
                      time.sleep(1)
                      if start + timeout < time.time():
                          raise TimeoutError(time.strftime("%d %b %Y %H:%M:%S", time.gmtime()) + " [" + self.name + "] Missing: " + str([e.pattern for e in tofind]) + ":\n" + reads[:50] + ".....\nSee {} for remainder".format(filename))
  
                  if process:
                      if common.is_win():
                          if not self.is_running():
                              return None
                      else:
                          process.poll()
                          if process.returncode == 0:
                              return None