在 Vue 客户端中将日志文件数据转换为 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]"}

我正在 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)


我想将此收到的响应转换为 JSON 对象。


     

米琪卡哇伊
浏览 172回答 3
3回答

人到中年有点甜

从您的代码看来,您似乎依赖 Gin 为您进行转换:return c.JSON(http.StatusOK, serverLog)您实际上可以自己处理它,但它可能需要逐行解组,因为日志文本文件不是有效的 JSON 数组。然后我将有效结构编组回 JSON。在下面的示例中,我使用 bufio 逐行读取文本文件,并将其解组为 Log 结构:package mainimport (    "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]"    }]

GCT1015

这看起来像是一个接一个有效的 Json 语句。您可以打开文件,使用 创建解码器json.NewDecoder(filehandle),然后读取一个 Json 语句(如果它一个接一个)。这是输入硬编码的示例:package mainimport (    "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 表达式的末尾,因此您可以一遍又一遍地继续阅读。

交互式爱情

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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go