From b76af052a474e5729b6d1fbea9b2c07dad4f86cb Mon Sep 17 00:00:00 2001 From: zouap Date: Thu, 1 Sep 2022 10:24:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=97=A5=E5=BF=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/api/v1/repo/cloudbrain.go | 104 ++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 7 deletions(-) diff --git a/routers/api/v1/repo/cloudbrain.go b/routers/api/v1/repo/cloudbrain.go index b450b2e26..d127f27ed 100755 --- a/routers/api/v1/repo/cloudbrain.go +++ b/routers/api/v1/repo/cloudbrain.go @@ -405,8 +405,21 @@ func CloudbrainDownloadLogFile(ctx *context.Context) { func CloudbrainGetLog(ctx *context.Context) { ID := ctx.Params(":id") - startLine := ctx.QueryInt("base_line") + job, err := models.GetCloudbrainByID(ID) + if err != nil { + log.Error("GetCloudbrainByJobName failed: %v", err, ctx.Data["MsgID"]) + ctx.ServerError(err.Error(), err) + return + } lines := ctx.QueryInt("lines") + baseLine := ctx.Query("base_line") + if baseLine == "" { + re := getLastLogFromModelDir(job.JobName, lines) + ctx.JSON(http.StatusOK, re) + return + } + + startLine := ctx.QueryInt("base_line") endLine := startLine + lines order := ctx.Query("order") if order == "asc" { @@ -416,12 +429,7 @@ func CloudbrainGetLog(ctx *context.Context) { startLine = 0 } } - job, err := models.GetCloudbrainByID(ID) - if err != nil { - log.Error("GetCloudbrainByJobName failed: %v", err, ctx.Data["MsgID"]) - ctx.ServerError(err.Error(), err) - return - } + result := getLogFromModelDir(job.JobName, startLine, endLine) if result == nil { log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) @@ -443,6 +451,88 @@ func CloudbrainGetLog(ctx *context.Context) { ctx.JSON(http.StatusOK, re) } +func getAllLineFromFile(path string) int { + count := 0 + reader, err := os.Open(path) + defer reader.Close() + if err == nil { + r := bufio.NewReader(reader) + for { + _, error := r.ReadString('\n') + if error == io.EOF { + log.Info("read file completed.") + break + } + if error != nil { + log.Info("read file error." + error.Error()) + break + } + count = count + 1 + } + } else { + log.Info("error:" + err.Error()) + } + return count +} + +func getLastLogFromModelDir(jobName string, lines int) map[string]interface{} { + prefix := "/" + setting.CBCodePathPrefix + jobName + "/model" + files, err := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, "") + if err != nil { + log.Error("query cloudbrain model failed: %v", err) + return nil + } + + re := "" + fileName := "" + count := 0 + allLines := 0 + for _, file := range files { + if strings.HasSuffix(file.FileName, "log.txt") { + fileName = file.FileName + path := storage.GetMinioPath(jobName+"/model/", file.FileName) + allLines = getAllLineFromFile(path) + start := allLines - 50 + if start < 0 { + start = 0 + } + count = allLines - start + log.Info("path=" + path) + reader, err := os.Open(path) + defer reader.Close() + if err == nil { + r := bufio.NewReader(reader) + for i := start; i < allLines; i++ { + line, error := r.ReadString('\n') + log.Info("line=" + line) + if error == io.EOF { + log.Info("read file completed.") + break + } + if error != nil { + log.Info("read file error." + error.Error()) + break + } + if error == nil { + re = re + line + } + } + } else { + log.Info("error:" + err.Error()) + } + break + } + } + + return map[string]interface{}{ + "JobName": jobName, + "Content": re, + "FileName": fileName, + "lines": count, + "endLine": allLines, + } +} + func getLogFromModelDir(jobName string, startLine int, endLine int) map[string]interface{} { prefix := "/" + setting.CBCodePathPrefix + jobName + "/model" files, err := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, "")