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

huangapple go评论82阅读模式
英文:

Convert log File Data to Json Object in Vue client

问题

我有一个如下所示的日志文件:

{"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]"
    }
]
英文:

I have a log file as follow:

{"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]"}

I am reading this file in the Golang echo server as follow:

file, err := os.Open(logFilePath)

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

and return this string generated back

return c.JSON(http.StatusOK, serverLog)

this is what I get as result

"{\"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"

I want to convert this received response to a JSON object.

This is my desired output:

[
    {
        "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

得分: 1

这看起来像是一个接一个的有效的 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 表达式的末尾停止,所以你可以一直读取下去。

英文:

That looks like one valid Json statement after another. You can open the file, create a decoder with json.NewDecoder(filehandle), and read one Json statement out if it after another. Heres' an example with the input hard coded:

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

Output should be:

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]

As you can see, Decode() stops at the end of a Json expression, so you can just keep reading over and over again.

答案2

得分: 1

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)
}
英文:
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)
}

答案3

得分: 1

从你的代码中看,似乎你依赖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("解组出错:%v\n", err)
			os.Exit(1)
		}
		logs = append(logs, log)
	}

	data, err := json.MarshalIndent(logs, "", "    ")
	if err != nil {
		fmt.Printf("编组出错:%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]"
    }
]
英文:

From your code it seems you depend on Gin to do the conversion for you:

return c.JSON(http.StatusOK, serverLog)

You can actually handle it yourself, but it may require Unmarshalling line by line, since the log text file isn't a valid JSON array. Then I marshall the valid structure back into JSON. In the example below I used bufio to read the text file by line, and unmarshall to a Log struct:

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

Or you can return the string from a function:

return fmt.Sprintf("%s\n", data)

Here's the output:

[
    {
        "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]"
    }
]

huangapple
  • 本文由 发表于 2021年11月2日 12:42:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/69805480.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定