All guides

LEARN \u00b7 DEBUGGING GUIDE

Log says success but the user still fails: how to debug misleading logs

You check the logs. Every request shows a 200 OK with 'success: true'. But users are reporting failures. The logs and reality disagree.

IntermediateObservability/performance debugging

What this usually means

Logs often record the intent to do something, not the outcome. A log that says 'email sent' might be placed before the actual send call. A log that says 'payment processed' might be in the success callback of a fire-and-forget operation that actually failed. Error handling that catches and logs but then swallows the error (does not re-throw or return an error response) creates logs that look normal while the user experiences a failure.

( 01 )Fast diagnosis

The first ten minutes \u2014 establish facts before touching code.

  • 1Compare the log message timing against the actual operation. Is the log before or after the operation?
  • 2Check if error handling catches exceptions, logs them, but then returns a 200 or success response.
  • 3Check if the operation is async and the log fires before the async work completes.
  • 4Check if the log message itself is misleading. 'Request processed' does not mean 'Request succeeded'.
  • 5Correlate server logs with client-side errors. Does the server log a 200 but the client sees a network error?
( 02 )Where to look

The specific files, logs, configs, and dashboards that usually own this bug.

  • searchLog statements in the critical path — are they before or after the operation?
  • searchError handling code — catch blocks — do they re-throw or return error responses?
  • searchAsync operation handling — await vs fire-and-forget
  • searchAPI response construction — does the status code match the body?
  • searchClient-side code — what does the client do with the response?
  • searchMiddleware — does any middleware modify the response after the handler logs success?
( 03 )Common root causes

Practical causes, not theory. These are the things you will actually find.

  • warningLog is placed before the operation — logs 'email sent' then the send call fails
  • warningError is caught and logged but the response still returns 200 OK
  • warningAsync operation is not awaited — log fires, operation runs later and fails unobserved
  • warningSuccess log is in a callback that never fires because the operation fails before reaching it
  • warningResponse is modified by error-handling middleware after the success log was written
  • warningLog says what was requested, not what was done — 'Processing payment' is not 'Payment processed'
( 04 )Fix patterns

Concrete fix directions. Pick the one that matches your root cause.

  • buildLog the outcome, not the intent. Log after the operation completes, not before.
  • buildUse structured logging with an 'outcome' field: { outcome: 'success' } or { outcome: 'failure', error: ... }
  • buildNever return 200 with an error message in the body — use appropriate HTTP status codes
  • buildIn error handlers, log the error and then re-throw or return a proper error response
  • buildAdd request IDs that flow from client to server and appear in all logs for correlation
  • buildCreate a log convention: 'Completed X with result Y' not 'About to do X'
( 05 )How to verify

A fix you cannot prove is a guess. Close the loop.

  • verifiedTrigger a known failure. The log must show an error outcome, not success.
  • verifiedCheck that every error response path logs an error outcome before sending the response.
  • verifiedCorrelate a user-reported failure with server logs using the request ID.
  • verifiedRun an end-to-end test that simulates failures and verifies logs match the actual outcome.
  • verifiedAudit log statements: every log that claims success should be placed after the operation succeeds.
( 06 )Mistakes to avoid

Things that make this bug worse or harder to find.

  • warningLogging 'success' before the operation completes
  • warningCatching errors, logging them, then returning 200
  • warningNot including a request ID in logs for correlation
  • warningLogging fire-and-forget operations as if they are synchronous
  • warningTrusting logs without verifying against actual outcomes