docs: def normalized_log_entries(raw_entries):
      '''Mimic the format returned by LambdaManager.logs()'''
      entry_start = r'([0-9:, \-]+) - .* - (\w+) - (.*)$'
      entry = None
      # process start/end here - avoid parsing log entries twice
      for line in raw_entries:
          m = re.match(entry_start, line)
          if m:
              # this is the start of a new entry
              # spit out the one previously built up (if any)
              if entry is not None:
                  yield entry
              (log_time, log_level, log_text) = m.groups()
              # convert time
              log_timestamp = _timestamp_from_string(log_time)
              # join level and first line of message
              msg = '[{}] {}'.format(log_level, log_text)
              entry = {
                  'timestamp': log_timestamp,
                  'message': msg,
              }
          else:
              # additional line(s) for entry (i.e. stack trace)
              entry['message'] = entry['message'] + line
      if entry is not None:
          # return the final entry
          yield entry