docs: def get_log_slice(db, job_id, start, stop):
      """
      Get a slice of the calculation log as a JSON list of rows
  
      :param db:
          a :class:`openquake.server.dbapi.Db` instance
      :param job_id:
          a job ID
      :param start:
          start of the slice
      :param stop:
          end of the slice (the last element is excluded)
      """
      start = int(start)
      stop = int(stop)
      limit = -1 if stop == 0 else stop - start
      logs = db('SELECT * FROM log WHERE job_id=?x '
                'ORDER BY id LIMIT ?s OFFSET ?s',
                job_id, limit, start)
      # NB: .isoformat() returns a string like '2016-08-29T15:42:34.984756'
      # we consider only the first 22 characters, i.e. '2016-08-29T15:42:34.98'
      return [[log.timestamp.isoformat()[:22], log.level,
               log.process, log.message] for log in logs]