Преобразование данных файла журнала в объект Json в клиенте Vue

# #javascript #json #go #logging #vuejs2

Вопрос:

У меня есть файл журнала, как показано ниже:

 {"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Route.go:74[IN : GetLatestLogs]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Service.go:40[IN : GetRecentServerErrorLogService]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"DAO.go:117[IN : GetRecentServerErrorLogDAO]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"DAO.go:148[OUT : GetRecentServerErrorLogDAO]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Service.go:47[OUT : GetRecentServerErrorLogService]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Route.go:79[OUT : GetLatestLogs]"} {"L":"DEBUG","T":"2021-11-01T17:40:55.331 0530","M":"Route.go:74[IN : GetLatestLogs]"}  

Я читаю этот файл на сервере Golang echo следующим образом:

 file, err := os.Open(logFilePath)  stat, _ := os.Stat(logFilePath) buf := make([]byte, stat.Size()) _, err = file.Read(buf) serverLog := string(buf)   

и верните эту сгенерированную строку обратно

 return c.JSON(http.StatusOK, serverLog)  

вот что я получаю в результате

 "{"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Route.go:74[IN : GetLatestLogs]"}n{"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Service.go:40[IN : GetRecentServerErrorLogService]"}n{"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"DAO.go:117[IN : GetRecentServerErrorLogDAO]"}n{"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"DAO.go:148[OUT : GetRecentServerErrorLogDAO]"}n{"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Service.go:47[OUT : GetRecentServerErrorLogService]"}n{"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Route.go:79[OUT : GetLatestLogs]"}n{"L":"DEBUG","T":"2021-11-01T17:40:55.331 0530","M":"Route.go:74[IN : GetLatestLogs]"}{"L":"DEBUG","T":"2021-11-02T09:48:49.982 0530","M":"controlPanelRoute.go:74[IN : GetLatestLogs]"}n{"L":"DEBUG","T":"2021-11-02T09:48:49.982 0530","M":"controlPanelService.go:40[IN : GetRecentServerErrorLogService]"}n{"L":"DEBUG","T":"2021-11-02T09:48:49.982 0530","M":"controlPanelDAO.go:117[IN : GetRecentServerErrorLogDAO]"}n"  

Я хочу преобразовать этот полученный ответ в объект JSON.

Это мой желаемый результат:

 [  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "Route.go:74[IN : GetLatestLogs]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "Service.go:40[IN : GetRecentServerErrorLogService]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "DAO.go:117[IN : GetRecentServerErrorLogDAO]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "DAO.go:148[OUT : GetRecentServerErrorLogDAO]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "Service.go:47[OUT : GetRecentServerErrorLogService]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "Route.go:79[OUT : GetLatestLogs]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:40:55.331 0530",  "M": "Route.go:74[IN : GetLatestLogs]"  } ]  

Ответ №1:

Судя по вашему коду, вы полагаетесь на то, что Джин выполнит преобразование за вас:

 return c.JSON(http.StatusOK, serverLog)  

На самом деле вы можете справиться с этим самостоятельно, но для этого может потребоваться разбиение на строки, поскольку текстовый файл журнала не является допустимым массивом JSON. Затем я возвращаю действительную структуру обратно в JSON. В приведенном ниже примере я использовал bufio для чтения текстового файла по строкам и не привязки к структуре журнала:

 package main  import (  "os"  "fmt"  "encoding/json"  "bufio" )  type Log struct {  L string  T string  M string }  func main() {  f, err := os.Open("log.txt")  defer f.Close()   var logs []Log  var log Log   input := bufio.NewScanner(f)   for input.Scan() {  textByte := []byte(input.Text())  err = json.Unmarshal(textByte, amp;log)  if err != nil {  fmt.Printf("Problems with unmarshalling: %vn", err)  os.Exit(1)  }  logs = append(logs, log)  }   data, err := json.MarshalIndent(logs, "", " ")  if err != nil {  fmt.Printf("Error in marshalling: %vn", err)  os.Exit(1)  }   fmt.Printf("%sn", data) }  

Или вы можете вернуть строку из функции:

 return fmt.Sprintf("%sn", data)  

Вот результат:

 [  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "Route.go:74[IN : GetLatestLogs]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "Service.go:40[IN : GetRecentServerErrorLogService]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.167 0530",  "M": "DAO.go:117[IN : GetRecentServerErrorLogDAO]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "DAO.go:148[OUT : GetRecentServerErrorLogDAO]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "Service.go:47[OUT : GetRecentServerErrorLogService]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:37:54.168 0530",  "M": "Route.go:79[OUT : GetLatestLogs]"  },  {  "L": "DEBUG",  "T": "2021-11-01T17:40:55.331 0530",  "M": "Route.go:74[IN : GetLatestLogs]"  } ]  

Ответ №2:

Это похоже на одно действительное утверждение Json за другим. Вы можете открыть файл, создать с его помощью декодер json.NewDecoder(filehandle) и прочитать один оператор Json, если он следует за другим. Вот пример с жестко закодированным вводом:

 package main  import (  "fmt"  "bytes"  "io"  "encoding/json" )  var input =[]byte( `{"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Route.go:74[IN : GetLatestLogs]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"Service.go:40[IN : GetRecentServerErrorLogService]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.167 0530","M":"DAO.go:117[IN : GetRecentServerErrorLogDAO]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"DAO.go:148[OUT : GetRecentServerErrorLogDAO]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Service.go:47[OUT : GetRecentServerErrorLogService]"} {"L":"DEBUG","T":"2021-11-01T17:37:54.168 0530","M":"Route.go:79[OUT : GetLatestLogs]"} {"L":"DEBUG","T":"2021-11-01T17:40:55.331 0530","M":"Route.go:74[IN : GetLatestLogs]"}`)  func main() {  r := json.NewDecoder(bytes.NewBuffer(input))  var data interface{}  for i := 0;;i  {  if err := r.Decode(amp;data); err != nil {  if err == io.EOF {  break  }  panic(err)  } else {  fmt.Printf("%d: % vn", i, data)  }  } }  

Результат должен быть:

 0: map[L:DEBUG M:Route.go:74[IN : GetLatestLogs] T:2021-11-01T17:37:54.167 0530] 1: map[L:DEBUG M:Service.go:40[IN : GetRecentServerErrorLogService] T:2021-11-01T17:37:54.167 0530] 2: map[L:DEBUG M:DAO.go:117[IN : GetRecentServerErrorLogDAO] T:2021-11-01T17:37:54.167 0530] 3: map[L:DEBUG M:DAO.go:148[OUT : GetRecentServerErrorLogDAO] T:2021-11-01T17:37:54.168 0530] 4: map[L:DEBUG M:Service.go:47[OUT : GetRecentServerErrorLogService] T:2021-11-01T17:37:54.168 0530] 5: map[L:DEBUG M:Route.go:79[OUT : GetLatestLogs] T:2021-11-01T17:37:54.168 0530] 6: map[L:DEBUG M:Route.go:74[IN : GetLatestLogs] T:2021-11-01T17:40:55.331 0530]  

Как вы можете видеть, Decode() останавливается в конце выражения Json, так что вы можете просто продолжать читать снова и снова.

Ответ №3:

 file, err := os.Open("/log/file/path") if err != nil {  panic(err) } info, err := file.Stat() if err != nil {  panic(err) }  logs := make(json.RawMessage, 1, info.Size() 1) // len=1 for '[' dec := json.NewDecoder(file) for dec.More() {  var log json.RawMessage  if err := dec.Decode(amp;log); err != nil {  panic(err)  }   logs = append(logs, log...)  logs = append(logs, ',') } if n := len(logs); n gt; 1 {  logs[0], logs[n-1] = '[', ']'  c.JSON(http.StatusOK, logs) }