# #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) }