func awaitShutdownSignals(chs ...shutdownCh) { sigCh := make(chan os.Signal) signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT) for sig := range sigCh { log.WithFields(log.Fields{"at": "shutdown-signal", "signal": sig}).Info() for _, ch := range chs { ch <- struct{}{} } } }
func (s *httpServer) handleHTTPError(w http.ResponseWriter, errMsg string, errCode int, fields ...log.Fields) { ff := log.Fields{"post.code": errCode} for _, f := range fields { for k, v := range f { ff[k] = v } } s.pErrors.Inc(1) log.WithFields(ff).Error(errMsg) http.Error(w, errMsg, errCode) }
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"]) }
func (s *httpServer) awaitShutdown() { <-s.shutdownCh s.isShuttingDown = true log.WithFields(log.Fields{"ns": "http", "at": "shutdown"}).Info() }