public Message log()

in linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/restful/EntranceRestfulApi.java [572:718]


  public Message log(HttpServletRequest req, @PathVariable("id") String id) {
    ModuleUserUtils.getOperationUser(req, "get job log");
    Message message = null;
    int fromLine = 0;
    int size = 100;
    boolean distinctLevel = true;
    String fromLineStr = req.getParameter("fromLine");
    String sizeStr = req.getParameter("size");
    if (StringUtils.isNotBlank(fromLineStr)) {
      fromLine = Math.max(Integer.parseInt(fromLineStr), 0);
    }
    if (StringUtils.isNotBlank(sizeStr)) {
      size = Integer.parseInt(sizeStr) >= 0 ? Integer.parseInt(sizeStr) : 10000;
    }
    String distinctLevelStr = req.getParameter("distinctLevel");
    if ("false".equals(distinctLevelStr)) {
      distinctLevel = false;
    }

    String realId;
    String execID;
    if (id.startsWith(ZuulEntranceUtils.EXEC_ID())) {
      // execID
      realId = ZuulEntranceUtils.parseExecID(id)[3];
      execID = id;
    } else {
      // taskID
      JobInstance jobInstance;
      try {
        jobInstance = parseHeaderToJobInstance(req);
      } catch (JsonProcessingException e) {
        logger.error("parse JobInstance json error, id: {}", id);
        message = Message.error("parse JobInstance json error");
        message.setMethod("/api/entrance/" + id + "/log");
        return message;
      }

      // return ok when job complete
      if (SchedulerEventState.isCompletedByStr(jobInstance.status())) {
        message =
            Message.error(
                "The job you just executed has ended. This interface no longer provides a query. It is recommended that you download the log file for viewing.(您刚刚执行的job已经结束,本接口不再提供查询,建议您下载日志文件进行查看)");
        message.setMethod("/api/entrance/" + id + "/log");
        return message;
      } else if (jobInstance.instanceRegistryTimestamp() > jobInstance.createTimestamp()) {
        logger.warn("The job {} wait failover, return customer log", id);
        message = Message.ok();
        message.setMethod("/api/entrance/" + id + "/log");
        String log =
            LogUtils.generateInfo(
                "The job will failover soon, please try again later.(job很快就会failover,请稍后再试)");
        Object retLog;
        if (distinctLevel) {
          String[] array = new String[4];
          array[2] = log;
          array[3] = log;
          retLog = new ArrayList<String>(Arrays.asList(array));
        } else {
          retLog = log;
        }
        message.data("log", retLog).data("execID", "").data("taskID", id).data("fromLine", 0);
        return message;
      } else {
        realId = jobInstance.jobReqId();
        execID =
            ZuulEntranceUtils.generateExecID(
                realId,
                Sender.getThisServiceInstance().getApplicationName(),
                new String[] {Sender.getThisInstance()});
      }
    }

    Option<Job> job = null;
    try {
      job = entranceServer.getJob(realId);
    } catch (final Throwable t) {
      message =
          Message.error(
              "The job you just executed has ended. This interface no longer provides a query. It is recommended that you download the log file for viewing.(您刚刚执行的job已经结束,本接口不再提供查询,建议您下载日志文件进行查看)");
      message.setMethod("/api/entrance/" + id + "/log");
      return message;
    }
    if (job != null && job.isDefined()) {
      logger.debug("begin to get log for {}(开始获取 {} 的日志)", job.get().getId(), job.get().getId());
      LogReader logReader =
          entranceServer.getEntranceContext().getOrCreateLogManager().getLogReader(realId);

      Object retLog = null;
      int retFromLine = 0;
      try {
        if (distinctLevel) {
          String[] logs = new String[4];
          retFromLine = logReader.readArray(logs, fromLine, size);
          retLog = new ArrayList<String>(Arrays.asList(logs));
        } else {
          StringBuilder sb = new StringBuilder();
          retFromLine = logReader.read(sb, fromLine, size);
          retLog = sb.toString();
        }
      } catch (IllegalStateException e) {
        logger.debug(
            "Failed to get log information for :{}(为 {} 获取日志失败)",
            job.get().getId(),
            job.get().getId(),
            e);
        message = Message.ok();
        message.setMethod("/api/entrance/" + id + "/log");
        message.data("log", "").data("execID", execID).data("fromLine", retFromLine + fromLine);
      } catch (final IllegalArgumentException e) {
        logger.debug(
            "Failed to get log information for :{}(为 {} 获取日志失败)",
            job.get().getId(),
            job.get().getId(),
            e);
        message = Message.ok();
        message.setMethod("/api/entrance/" + id + "/log");
        message.data("log", "").data("execID", execID).data("fromLine", retFromLine + fromLine);
        return message;
      } catch (final Exception e1) {
        logger.debug(
            "Failed to get log information for :{}(为 {} 获取日志失败)",
            job.get().getId(),
            job.get().getId(),
            e1);
        message = Message.error("Failed to get log information(获取日志信息失败)");
        message.setMethod("/api/entrance/" + id + "/log");
        message.data("log", "").data("execID", execID).data("fromLine", retFromLine + fromLine);
        return message;
      } finally {
        if (null != logReader && job.get().isCompleted()) {
          IOUtils.closeQuietly(logReader);
        }
      }
      message = Message.ok();
      message.setMethod("/api/entrance/" + id + "/log");
      message.data("log", retLog).data("execID", execID).data("fromLine", retFromLine + fromLine);
      logger.debug("success to get log for {} (获取 {} 日志成功)", job.get().getId(), job.get().getId());
    } else {
      message =
          Message.error(
              "Can't find execID(不能找到execID): "
                  + id
                  + "Corresponding job, can not get the corresponding log(对应的job,不能获得对应的日志)");
      message.setMethod("/api/entrance/" + id + "/log");
    }
    return message;
  }