Skip to content

Commit

Permalink
caddyhttp: Add uuid to access logs when used (#5859)
Browse files Browse the repository at this point in the history
  • Loading branch information
francislavoie authored Dec 13, 2023

Unverified

This user has not yet uploaded their public signing key.
1 parent dc12bd9 commit 3d7d60f
Showing 3 changed files with 22 additions and 0 deletions.
1 change: 1 addition & 0 deletions caddyconfig/httpcaddyfile/shorthands.go
Original file line number Diff line number Diff line change
@@ -64,6 +64,7 @@ func placeholderShorthands() []string {
"{remote_port}", "{http.request.remote.port}",
"{scheme}", "{http.request.scheme}",
"{uri}", "{http.request.uri}",
"{uuid}", "{http.request.uuid}",
"{tls_cipher}", "{http.request.tls.cipher_suite}",
"{tls_version}", "{http.request.tls.version}",
"{tls_client_fingerprint}", "{http.request.tls.client.fingerprint}",
12 changes: 12 additions & 0 deletions modules/caddyhttp/logging.go
Original file line number Diff line number Diff line change
@@ -151,6 +151,18 @@ func (e *ExtraLogFields) Add(field zap.Field) {
e.fields = append(e.fields, field)
}

// Set sets a field in the list of extra fields to log.
// If the field already exists, it is replaced.
func (e *ExtraLogFields) Set(field zap.Field) {
for i := range e.fields {
if e.fields[i].Key == field.Key {
e.fields[i] = field
return
}
}
e.fields = append(e.fields, field)
}

const (
// Variable name used to indicate that this request
// should be omitted from the access logs
9 changes: 9 additions & 0 deletions modules/caddyhttp/replacer.go
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ import (
"time"

"github.com/google/uuid"
"go.uber.org/zap"

"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/modules/caddytls"
@@ -157,9 +158,17 @@ func addHTTPVarsToReplacer(repl *caddy.Replacer, req *http.Request, w http.Respo
case "http.request.duration_ms":
start := GetVar(req.Context(), "start_time").(time.Time)
return time.Since(start).Seconds() * 1e3, true // multiply seconds to preserve decimal (see #4666)

case "http.request.uuid":
// fetch the UUID for this request
id := GetVar(req.Context(), "uuid").(*requestID)

// set it to this request's access log
extra := req.Context().Value(ExtraLogFieldsCtxKey).(*ExtraLogFields)
extra.Set(zap.String("uuid", id.String()))

return id.String(), true

case "http.request.body":
if req.Body == nil {
return "", true

0 comments on commit 3d7d60f

Please sign in to comment.