class_docstr: Disk storage for stdout / stderr of driver script logs.
docstr: Returns the last MAX_LOG_SIZE (20000) characters in the last
  `num_log_lines` lines.
  
  Args:
      job_id: The id of the job whose logs we want to return
      num_log_lines: The number of lines to return.
docstr_tok: ["Returns","the","last","MAX_LOG_SIZE","(","20000",")","characters","in","the","last","`","num_log_lines","`","lines",".","Args",":","job_id",":","The","id","of","the","job","whose","logs","we","want","to","return","num_log_lines",":","The","number","of","lines","to","return","."]
code: def get_last_n_log_lines(
      self, job_id: str, num_log_lines=NUM_LOG_LINES_ON_ERROR
  ) -> str:
      """
      Returns the last MAX_LOG_SIZE (20000) characters in the last
      `num_log_lines` lines.
  
      Args:
          job_id: The id of the job whose logs we want to return
          num_log_lines: The number of lines to return.
      """
      log_tail_iter = self.tail_logs(job_id)
      log_tail_deque = deque(maxlen=num_log_lines)
      for lines in log_tail_iter:
          if lines is None:
              break
          else:
              # log_tail_iter can return batches of lines at a time.
              for line in lines:
                  log_tail_deque.append(line)
  
      return "".join(log_tail_deque)[-self.MAX_LOG_SIZE :]
  
imports: import asyncio
  import copy
  import json
  import logging
  import os
  import psutil
  import random
  import signal
  import string
  import subprocess
  import sys
  import time
  import traceback
  from asyncio.tasks import FIRST_COMPLETED
  from collections import deque
  from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
  from ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy, SchedulingStrategyT
  import ray
  from ray._private.gcs_utils import GcsAioClient
  from ray._private.utils import run_background_task
  import ray._private.ray_constants
  from ray._private.runtime_env.constants import RAY_JOB_CONFIG_JSON_ENV_VAR
  from ray.actor import ActorHandle
  from ray.dashboard.consts import RAY_JOB_ALLOW_DRIVER_ON_WORKER_NODES_ENV_VAR, DEFAULT_JOB_START_TIMEOUT_SECONDS, RAY_JOB_START_TIMEOUT_SECONDS_ENV_VAR
  from ray.dashboard.modules.job.common import JOB_ID_METADATA_KEY, JOB_NAME_METADATA_KEY, JOB_ACTOR_NAME_TEMPLATE, JOB_LOGS_PATH_TEMPLATE, SUPERVISOR_ACTOR_RAY_NAMESPACE, JobInfo, JobInfoStorageClient
  from ray.dashboard.modules.job.utils import file_tail_iterator
  from ray.exceptions import ActorUnschedulableError, RuntimeEnvSetupError
  from ray.job_submission import JobStatus
  from ray._private.event.event_logger import get_event_logger
  from ray.core.generated.event_pb2 import Event
label_desc: Use image node_id 3 for calling the JobLogStorageClient obj's underlying member method code with example usage: obj.get_last_n_log_lines(job_id, num_log_lines) and returns: str