1 回答
TA贡献1887条经验 获得超5个赞
该错误来自如何Fscanf
解析空格分隔的字符串。读取日期和 HTTP 字符串时,这会成为一个问题:
当它读取日期时,09/May/2018:16:00:39 +0000
它不会读取日期,而是会读取直到第一个空格:09/May/2018:16:00:39
然后是expect ]
。
要解决此问题,将字符串解析为 是有意义的[%s %s]
,但这会更巧妙地失败。它将解析时区,+0000]
因为它停在第一个空格处,而不是根据格式字符串。HTTP 字符串也会出现同样的问题:它在动词之后停止解析GET
,然后在路由之后停止/report
解析,但是在读取协议时它读取HTTP/1.0"
not HTTP/1.0
。
一个可行的解决方案如下:
package main
import (
"fmt"
"log"
"strings"
)
func main() {
var host, user, date, tzOffset, verb, route, proto string
var code, size int
r := strings.NewReader(`127.0.0.1 - james [09/May/2018:16:00:39 +0000] "GET /report HTTP/1.0" 200 123`)
_, err := fmt.Fscanf(r, `%s - %s %s %s %s %s %s %d %d`,
&host, &user, &date, &tzOffset, &verb, &route, &proto, &code,
&size)
if err != nil {
log.Fatal(err)
}
date = date[1:] + " " + tzOffset[:len(tzOffset)-1]
httpString := verb[1:] + " " + route + " " + proto[:len(proto)-1]
fmt.Println(host, user, date, httpString, code, size)
}
这里,我们在解析时忽略日期和 HTTP 字符串周围的括号和引号,然后将其删除。
输出:
127.0.0.1 james 09/May/2018:16:00:39 +0000 GET /report HTTP/1.0 200 123
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报