types/logger, logtail: add mechanism to do structured JSON logs
e.g. the change to ipnlocal in this commit ultimately logs out: {"logtail":{"client_time":"2022-02-17T20:40:30.511381153-08:00","server_time":"2022-02-18T04:40:31.057771504Z"},"type":"Hostinfo","val":{"GoArch":"amd64","Hostname":"tsdev","IPNVersion":"1.21.0-date.20220107","OS":"linux","OSVersion":"Debian 11.2 (bullseye); kernel=5.10.0-10-amd64"},"v":1} Change-Id: I668646b19aeae4a2fed05170d7b279456829c844 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:

committed by
Brad Fitzpatrick

parent
8c3c5e80b7
commit
84138450a4
@ -530,6 +530,9 @@ func (l *Logger) encode(buf []byte, level int) []byte {
|
||||
"client_time": now.Format(time.RFC3339Nano),
|
||||
}
|
||||
}
|
||||
if level > 0 {
|
||||
obj["v"] = level
|
||||
}
|
||||
|
||||
b, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
@ -577,6 +580,7 @@ var (
|
||||
openBracketV = []byte("[v")
|
||||
v1 = []byte("[v1] ")
|
||||
v2 = []byte("[v2] ")
|
||||
vJSON = []byte("[v\x00JSON]") // precedes log level '0'-'9' byte, then JSON value
|
||||
)
|
||||
|
||||
// level 0 is normal (or unknown) level; 1+ are increasingly verbose
|
||||
@ -590,5 +594,14 @@ func parseAndRemoveLogLevel(buf []byte) (level int, cleanBuf []byte) {
|
||||
if bytes.Contains(buf, v2) {
|
||||
return 2, bytes.ReplaceAll(buf, v2, nil)
|
||||
}
|
||||
if i := bytes.Index(buf, vJSON); i != -1 {
|
||||
rest := buf[i+len(vJSON):]
|
||||
if len(rest) >= 2 {
|
||||
v := rest[0]
|
||||
if v >= '0' && v <= '9' {
|
||||
return int(v - '0'), rest[1:]
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0, buf
|
||||
}
|
||||
|
Reference in New Issue
Block a user