我有一個日志檔案如下:
{"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 回聲服務器中讀取此檔案,如下所示:
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]"
}
]
uj5u.com熱心網友回復:
從您的代碼看來,您似乎依賴 Gin 為您進行轉換:
return c.JSON(http.StatusOK, serverLog)
您實際上可以自己處理它,但它可能需要逐行解組,因為日志文本檔案不是有效的 JSON 陣列。然后我將有效結構編組回 JSON。在下面的示例中,我使用 bufio 逐行讀取文本檔案,并將其解組為 Log 結構:
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, &log)
if err != nil {
fmt.Printf("Problems with unmarshalling: %v\n", err)
os.Exit(1)
}
logs = append(logs, log)
}
data, err := json.MarshalIndent(logs, "", " ")
if err != nil {
fmt.Printf("Error in marshalling: %v\n", err)
os.Exit(1)
}
fmt.Printf("%s\n", data)
}
或者您可以從函式回傳字串:
return fmt.Sprintf("%s\n", 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]"
}
]
uj5u.com熱心網友回復:
這看起來像是一個又一個有效的 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(&data); err != nil {
if err == io.EOF {
break
}
panic(err)
} else {
fmt.Printf("%d: % v\n", 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 運算式的末尾停止,因此您可以一遍又一遍地閱讀。
uj5u.com熱心網友回復:
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(&log); err != nil {
panic(err)
}
logs = append(logs, log...)
logs = append(logs, ',')
}
if n := len(logs); n > 1 {
logs[0], logs[n-1] = '[', ']'
c.JSON(http.StatusOK, logs)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347819.html
標籤:javascript json 走 日志记录 Vuejs2
