为了账号安全,请及时绑定邮箱和手机立即绑定

在 Vue 客户端中将日志文件数据转换为 Json 对象

在 Vue 客户端中将日志文件数据转换为 Json 对象

Go
米琪卡哇伊 2022-10-10 18:55:41
我有一个日志文件如下:{"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 对象。     
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

从您的代码看来,您似乎依赖 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]"

    }

]


查看完整回答
反对 回复 2022-10-10
?
GCT1015

TA贡献1827条经验 获得超4个赞

这看起来像是一个接一个有效的 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 表达式的末尾,因此您可以一遍又一遍地继续阅读。


查看完整回答
反对 回复 2022-10-10
?
交互式爱情

TA贡献1712条经验 获得超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(&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)

}


查看完整回答
反对 回复 2022-10-10
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信