Skip to content

Instantly share code, notes, and snippets.

@alexisvisco
Created August 17, 2019 14:58
Show Gist options
  • Select an option

  • Save alexisvisco/4b846978c9346e4eaf618bb632c0693a to your computer and use it in GitHub Desktop.

Select an option

Save alexisvisco/4b846978c9346e4eaf618bb632c0693a to your computer and use it in GitHub Desktop.
logfmt parser in go that return map[string]string
func ParseLogfmt(msg string) map[string]string {
type kv struct {
key, val string
}
var pair *kv = nil
pairs := make(map[string]string)
buf := bytes.NewBuffer([]byte{})
var (
escape = false
garbage = false
quoted = false
)
completePair := func(buffer *bytes.Buffer, pair *kv) kv {
if pair != nil {
return kv{pair.key, buffer.String()}
} else {
return kv{buffer.String(), ""}
}
}
for _, c := range msg {
if !quoted && c == ' ' {
if buf.Len() != 0 {
if !garbage {
p := completePair(buf, pair)
pairs[p.key] = p.val
pair = nil
}
buf.Reset()
}
garbage = false
} else if !quoted && c == '=' {
if buf.Len() != 0 {
pair = &kv{key: buf.String(), val: ""}
buf.Reset()
} else {
garbage = true
}
} else if quoted && c == '\\' {
escape = true
} else if c == '"' {
if escape {
buf.WriteRune(c)
escape = false
} else {
quoted = !quoted
}
} else {
if escape {
buf.WriteRune('\\')
escape = false
}
buf.WriteRune(c)
}
}
if !garbage {
p := completePair(buf, pair)
pairs[p.key] = p.val
}
return pairs
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment