// 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"]) }