Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,12 @@ func RequestLogger(logger *slog.Logger, o *Options) func(http.Handler) http.Hand
logAttrs = appendAttrs(logAttrs, slog.Any(ErrorKey, ErrClientAborted), slog.String(s.ErrorType, "ClientAborted"))
}

var reqUnreadBytes int64
if consumeBody {
// Ensure the request body is fully read if the underlying HTTP handler didn't do so.
n, _ := io.Copy(io.Discard, r.Body)
if n > 0 {
logAttrs = appendAttrs(logAttrs, slog.Any(s.RequestBytesUnread, n))
reqUnreadBytes, _ = io.Copy(io.Discard, r.Body)
if reqUnreadBytes > 0 {
logAttrs = appendAttrs(logAttrs, slog.Int64(s.RequestBytesUnread, reqUnreadBytes))
}
}
if logReqBody {
Expand All @@ -169,9 +170,11 @@ func RequestLogger(logger *slog.Logger, o *Options) func(http.Handler) http.Hand
if o.LogAdditionalAttrs != nil {
if o.LogAdditionalAttrs.AdditionalAttrs != nil {
logAttrs = appendAttrs(logAttrs, o.LogAdditionalAttrs.AdditionalAttrs(&LogDetails{
Request: r,
RequestBody: reqBody.String(),
ResponseStatus: statusCode,
Request: r,
RequestBody: reqBody.String(),
RequestBytesUnread: reqUnreadBytes,
ResponseStatus: statusCode,
ResponseBytes: ww.BytesWritten(),
})...)
}
} else if o.LogExtraAttrs != nil {
Expand Down
7 changes: 5 additions & 2 deletions options.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ type LogAdditionalAttrsOptions struct {
type LogDetails struct {
Request *http.Request
// Contains the request body if either Options.LogRequestBody or LogAdditionalAttrsOptions.IncludeRequestBody is true, otherwise it is empty.
RequestBody string
ResponseStatus int
RequestBody string
// Contains the number of unread bytes from the request body if either Options.LogRequestBody or LogAdditionalAttrsOptions.IncludeRequestBody is true, otherwise it is 0.
RequestBytesUnread int64
ResponseStatus int
ResponseBytes int
}