11
"github.com/gorilla/mux"
12
"github.com/sirupsen/logrus"
15
type responseWriter struct {
19
var apiLogger = &logrus.Logger{
20
Formatter: &logrus.TextFormatter{
22
DisableLevelTruncation: true,
24
QuoteEmptyFields: true,
25
TimestampFormat: time.RFC3339,
27
Level: logrus.TraceLevel,
28
Out: logrus.StandardLogger().Out,
31
func (l responseWriter) Write(b []byte) (int, error) {
32
apiLogger.WithFields(logrus.Fields{
34
"X-Reference-Id": l.Header().Get("X-Reference-Id"),
36
return l.ResponseWriter.Write(b)
39
func (l responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
40
if wrapped, ok := l.ResponseWriter.(http.Hijacker); ok {
41
return wrapped.Hijack()
44
return nil, nil, errors.New("ResponseWriter does not support hijacking")
47
func (l responseWriter) Header() http.Header {
48
return l.ResponseWriter.Header()
51
func (l responseWriter) WriteHeader(statusCode int) {
52
l.ResponseWriter.WriteHeader(statusCode)
55
func (l responseWriter) Flush() {
56
if wrapped, ok := l.ResponseWriter.(http.Flusher); ok {
61
func loggingHandler() mux.MiddlewareFunc {
62
return func(h http.Handler) http.Handler {
63
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
64
annotated := apiLogger.WithFields(logrus.Fields{
66
"X-Reference-Id": r.Header.Get("X-Reference-Id"),
68
r.Body = io.NopCloser(
69
io.TeeReader(r.Body, annotated.WriterLevel(logrus.TraceLevel)))
71
w = responseWriter{ResponseWriter: w}