func TestContext(t *testing.T) { l := log.NewStdLogger() ctx := context.Background() ctx = ctxlog.NewContext(ctx, l) haveL := ctxlog.FromContext(ctx) assert.Exactly(t, l, haveL) haveL2 := ctxlog.FromContext(context.TODO()) assert.Exactly(t, log.BlackHole{}, haveL2) }
// WithAccessLog is a middleware that logs all access requests performed on the // sub handler using github.com/corestoreio/csfw/net/ctxlog and // github.com/rs/xstats stored in context. func WithAccessLog() ctxhttp.Middleware { return func(h ctxhttp.HandlerFunc) ctxhttp.HandlerFunc { return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error { // Time request reqStart := time.Now() // Sniff the status and content size for logging lw := mutil.WrapWriter(w) err := h.ServeHTTPContext(ctx, lw, r) // Compute request duration reqDur := time.Since(reqStart) // Get request status status := ResponseStatus(ctx, lw.Status()) // Log request stats sts := xstats.FromContext(ctx) tags := []string{ "status:" + status, "status_code:" + strconv.Itoa(lw.Status()), } sts.Timing("request_time", reqDur, tags...) sts.Histogram("request_size", float64(lw.BytesWritten()), tags...) ctxlog.FromContext(ctx).Info("request", "error", util.Errors(err), "method", r.Method, "uri", r.URL.String(), "type", "access", "status", status, "status_code", lw.Status(), "duration", reqDur.Seconds(), "size", lw.BytesWritten(), "remote_addr", httputil.GetRemoteAddr(r).String(), "user_agent", r.Header.Get("User-Agent"), "referer", r.Header.Get("Referer"), ) return err } } }