Documentation
¶
Overview ¶
Package implements the decoding of logfmt key-value pairs.
Example logfmt message:
foo=bar a=14 baz="hello kitty" cool%story=bro f %^asdf
Example result in JSON:
{ "foo": "bar", "a": 14, "baz": "hello kitty", "cool%story": "bro", "f": true, "%^asdf": true }
EBNFish:
ident_byte = any byte greater than ' ', excluding '=' and '"'
string_byte = any byte excluding '"' and '\'
garbage = !ident_byte
ident = ident_byte, { ident byte }
key = ident
value = ident | '"', { string_byte | '\', '"' }, '"'
pair = key, '=', value | key, '=' | key
message = { garbage, pair }, garbage
Example (CustomHandler) ¶
package main
import (
"bytes"
"fmt"
"github.com/kr/logfmt"
"log"
"strconv"
)
type Measurement struct {
Key string
Val float64
Unit string // (e.g. ms, MB, etc)
}
type Measurements []*Measurement
var measurePrefix = []byte("measure.")
func (mm *Measurements) HandleLogfmt(key, val []byte) error {
if !bytes.HasPrefix(key, measurePrefix) {
return nil
}
i := bytes.LastIndexFunc(val, isDigit)
v, err := strconv.ParseFloat(string(val[:i+1]), 10)
if err != nil {
return err
}
m := &Measurement{
Key: string(key[len(measurePrefix):]),
Val: v,
Unit: string(val[i+1:]),
}
*mm = append(*mm, m)
return nil
}
// return true if r is an ASCII digit only, as opposed to unicode.IsDigit.
func isDigit(r rune) bool {
return '0' <= r && r <= '9'
}
func main() {
var data = []byte("measure.a=1ms measure.b=10 measure.c=100MB measure.d=1s garbage")
mm := make(Measurements, 0)
if err := logfmt.Unmarshal(data, &mm); err != nil {
log.Fatalf("err=%q", err)
}
for _, m := range mm {
fmt.Printf("%v\n", *m)
}
}
Output: {a 1 ms} {b 10 } {c 100 MB} {d 1 s}
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrUnterminatedString = errors.New("logfmt: unterminated string")
Functions ¶
Types ¶
type Handler ¶
Handler is the interface implemented by objects that accept logfmt key-value pairs. HandleLogfmt must copy the logfmt data if it wishes to retain the data after returning.
func NewStructHandler ¶
type HandlerFunc ¶
The HandlerFunc type is an adapter to allow the use of ordinary functions as logfmt handlers. If f is a function with the appropriate signature, HandlerFunc(f) is a Handler object that calls f.
func (HandlerFunc) HandleLogfmt ¶
func (f HandlerFunc) HandleLogfmt(key, val []byte) error
type InvalidUnmarshalError ¶
An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. (The argument to Unmarshal must be a non-nil pointer.)
func (*InvalidUnmarshalError) Error ¶
func (e *InvalidUnmarshalError) Error() string
type StructHandler ¶
type StructHandler struct {
// contains filtered or unexported fields
}
StructHandler unmarshals logfmt into a struct. It matches incoming keys to the the struct's fields (either the struct field name or its tag, preferring an exact match but also accepting a case-insensitive match.
Field types supported by StructHandler are:
all numeric types (e.g. float32, int, etc.) []byte string bool - true if key is present, false otherwise (the value is ignored). time.Duration - uses time.ParseDuration
If a field is a pointer to an above type, and a matching key is not present in the logfmt data, the pointer will be untouched.
If v is not a pointer to an Handler or struct, Unmarshal will return an error.
func (*StructHandler) HandleLogfmt ¶
func (h *StructHandler) HandleLogfmt(key, val []byte) error
type UnmarshalTypeError ¶
type UnmarshalTypeError struct {
Value string // the logfmt value
Type reflect.Type // type of Go value it could not be assigned to
}
An UnmarshalTypeError describes a logfmt value that was not appropriate for a value of a specific Go type.
func (*UnmarshalTypeError) Error ¶
func (e *UnmarshalTypeError) Error() string