golang如何解析nginx日志中url的非法字符串

q8l4jmvw  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(128)

我尝试使用Golang将Nginx访问日志文件解析为json,但是一些特殊的url会导致解析失败
举例来说:

str := "{\"time\":\"2023-07-20T10:11:29+08:00\",\"method\":\"GET\",\"uri\":\"/www.baidu.com/eu\\xG8\\xB8\\xE9\\xQ1\\x9F\\xZ7\\xE8\\xAE\\xCF\\xF9\\xB5\\x12\"}"
data := make(Data)

if err := json.Unmarshal([]byte(str), &data); err == nil {
    log.Printf("json success, %#v", data)
} else {
    log.Print(err)
}
// stderr: invalid character 'x' in string escape code

字符串
https://go.dev/play/p/ubhsABdHV2G
我搜索了一下,发现好像是特殊字符造成的,但是这个应该怎么解决呢?
期待您的回复。

stszievb

stszievb1#

Go语言偶然发现了像\xG8 b/c \x这样的字符串,这意味着后面有一个十六进制码,但G8(以及其他字符串)不是十六进制码。不知道\xG8应该是什么意思,但是如果你只是想读一个字符串,其中\xG8不被解释为(错误的)十六进制值,你必须用另一个反斜杠转义\,例如。比如

strAdjusted := strings.ReplaceAll(str, "\\x", "\\\\x")

字符串
这看起来有点奇怪,因为所有这些反斜杠,但基本上\\将被解析为一个\字符,没有任何特殊意义,所以你在str中将\替换为\\,告诉Go不要将其中的\x解释为十六进制的转义。
也就是说,我不确定这是否会让你更接近你的目标。它仍然是一个破碎的URL。您必须应用一些自定义逻辑来将\xG8...Map回有效字符,以从中获取工作url。

相关问题