in systemtest/apmservertest/server.go [463:510]
func (s *Server) consumeStderr(procStderr io.Reader, out *io.PipeWriter) {
type logEntry struct {
Timestamp logpTimestamp `json:"@timestamp"`
Message string `json:"message"`
Level zapcore.Level `json:"log.level"`
Logger string `json:"log.logger"`
Origin struct {
File string `json:"file.name"`
Line int `json:"file.line"`
} `json:"log.origin"`
}
decoder := json.NewDecoder(procStderr)
for {
var raw json.RawMessage
if err := decoder.Decode(&raw); err != nil {
break
}
var entry logEntry
if err := json.Unmarshal(raw, &entry); err != nil {
break
}
var fields map[string]interface{}
if err := json.Unmarshal(raw, &fields); err != nil {
break
}
delete(fields, "@timestamp")
delete(fields, "log.level")
delete(fields, "log.logger")
delete(fields, "log.origin")
delete(fields, "message")
s.Logs.add(LogEntry{
Timestamp: time.Time(entry.Timestamp),
Logger: entry.Logger,
Level: entry.Level,
File: entry.Origin.File,
Line: entry.Origin.Line,
Message: entry.Message,
Fields: fields,
})
}
s.Logs.close()
// Send the remaining stderr to s.Stderr.
procStderr = io.MultiReader(decoder.Buffered(), procStderr)
_, err := io.Copy(out, procStderr)
out.CloseWithError(err)
}