From 6cc36ab1766cf44d17657c08fe7fec2cc6230633 Mon Sep 17 00:00:00 2001 From: Eli Yukelzon Date: Thu, 18 Apr 2019 12:16:49 +0300 Subject: [PATCH] [MM-14890] Logs endpoint always returns an empty line (#10559) * fixed new line being returned in logs, improved the test * improved the EOL check * Fixed var shadowning --- api4/system_test.go | 3 +++ app/admin.go | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/api4/system_test.go b/api4/system_test.go index 6047c941d4..93ca0c6157 100644 --- a/api4/system_test.go +++ b/api4/system_test.go @@ -198,6 +198,9 @@ func TestGetLogs(t *testing.T) { t.Log(len(logs)) t.Fatal("wrong length") } + for i := 10; i < 20; i++ { + assert.Containsf(t, logs[i-10], fmt.Sprintf(`"msg":"%d"`, i), "Log line doesn't contain correct message") + } logs, resp = th.SystemAdminClient.GetLogs(1, 10) CheckNoError(t, resp) diff --git a/app/admin.go b/app/admin.go index 8f47864763..a90972665c 100644 --- a/app/admin.go +++ b/app/admin.go @@ -51,7 +51,8 @@ func (a *App) GetLogsSkipSend(page, perPage int) ([]string, *model.AppError) { var lines []string if *a.Config().LogSettings.EnableFile { - file, err := os.Open(utils.GetLogFileLocation(*a.Config().LogSettings.FileLocation)) + logFile := utils.GetLogFileLocation(*a.Config().LogSettings.FileLocation) + file, err := os.Open(logFile) if err != nil { return nil, model.NewAppError("getLogs", "api.admin.file_read_error", nil, err.Error(), http.StatusInternalServerError) } @@ -61,7 +62,17 @@ func (a *App) GetLogsSkipSend(page, perPage int) ([]string, *model.AppError) { var newLine = []byte{'\n'} var lineCount int const searchPos = -1 - lineEndPos, err := file.Seek(0, io.SeekEnd) + b := make([]byte, 1) + var endOffset int64 = 0 + + // if the file exists and it's last byte is '\n' - skip it + var stat os.FileInfo + if stat, err = os.Stat(logFile); err == nil { + if _, err = file.ReadAt(b, stat.Size()-1); err == nil && b[0] == newLine[0] { + endOffset = -1 + } + } + lineEndPos, err := file.Seek(endOffset, io.SeekEnd) if err != nil { return nil, model.NewAppError("getLogs", "api.admin.file_read_error", nil, err.Error(), http.StatusInternalServerError) } @@ -71,7 +82,6 @@ func (a *App) GetLogsSkipSend(page, perPage int) ([]string, *model.AppError) { return nil, model.NewAppError("getLogs", "api.admin.file_read_error", nil, err.Error(), http.StatusInternalServerError) } - b := make([]byte, 1) _, err = file.ReadAt(b, pos) if err != nil { return nil, model.NewAppError("getLogs", "api.admin.file_read_error", nil, err.Error(), http.StatusInternalServerError)