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;
}