A useful incident log lets you follow one request without exposing its credentials. Logging everything into a flat message string makes both tasks harder. Structured fields preserve the context needed for filtering, grouping and redaction.
You apply inclusive severity thresholds, remove sensitive field values recursively and capture output from a local logging.Logger. The exercises never configure the root logger, so one check cannot change another check's logging behavior. A request with an explicit empty ID differs from a missing ID; an empty message is still an event. Redaction matches exact sensitive keys rather than erasing every field that happens to contain a similar substring. Preserve the evidence while removing the secret.