func main() { flag.Parse() // extract address from host flag addr, err := ma.NewMultiaddr(*host) if err != nil { log.WithField("err", err).Fatal("NewMultiaddr() failed") } p := addr.Protocols() if len(p) < 2 { log.WithField("addr", addr).Fatal("need two protocols in host flag (/ip/tcp)") } _, host, err := manet.DialArgs(addr) if err != nil { log.WithField("err", err).Fatal("manet.DialArgs() failed") } if *verbose { // lower log level log.SetLevel(log.DebugLevel) } // construct url to dial var u url.URL u.Scheme = "http" u.Host = host u.Path = *endpoint // show what we got start := time.Now() log.WithFields(log.Fields{ "when": start, "tries": *tries, "timeout": *timeout, "url": u.String(), }).Debug("starting") for *tries > 0 { f := log.Fields{"tries": *tries} err := checkOK(http.Get(u.String())) if err == nil { f["took"] = time.Since(start) log.WithFields(f).Println("status ok - endpoint reachable") os.Exit(0) } f["error"] = err log.WithFields(f).Debug("get failed") time.Sleep(*timeout) *tries-- } log.Println("failed.") os.Exit(1) }
// log is a private method invoked by the public Log, Info, Error methods func (e *entry) log() { // accumulate metadata accum := Metadata{} for _, loggable := range e.loggables { accum = DeepMerge(accum, loggable.Loggable()) } // apply final attributes to reserved keys // TODO accum["level"] = level accum["event"] = e.event accum["system"] = e.system accum["time"] = FormatRFC3339(time.Now()) // TODO roll our own event logger logrus.WithFields(map[string]interface{}(accum)).Info(e.event) }
func TestLogstashFormatter(t *testing.T) { assert := assert.New(t) lf := LogstashFormatter{Type: "abc"} fields := logrus.Fields{ "message": "def", "level": "ijk", "type": "lmn", "one": 1, "pi": 3.14, "bool": true, } entry := logrus.WithFields(fields) entry.Message = "msg" entry.Level = logrus.InfoLevel b, _ := lf.Format(entry) var data map[string]interface{} dec := json.NewDecoder(bytes.NewReader(b)) dec.UseNumber() dec.Decode(&data) // base fields assert.Equal(json.Number("1"), data["@version"]) assert.NotEmpty(data["@timestamp"]) assert.Equal("abc", data["type"]) assert.Equal("msg", data["message"]) assert.Equal("info", data["level"]) // substituted fields assert.Equal("def", data["fields.message"]) assert.Equal("ijk", data["fields.level"]) assert.Equal("lmn", data["fields.type"]) // formats assert.Equal(json.Number("1"), data["one"]) assert.Equal(json.Number("3.14"), data["pi"]) assert.Equal(true, data["bool"]) }