You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ai_synth/docs/superpowers/specs/2026-03-23-error-location-l...

68 lines
2.1 KiB
Markdown

# Design: Error Location Logging
**Date**: 2026-03-23
**Scope**: Add source file and line number to WARN and ERROR log lines
---
## Context
During the first Docker deployment, several runtime errors (non-existent table, VARCHAR constraint violation) produced log lines like `ERROR ai_synth_backend::errors: Database error: PgDatabaseError { ... }` with no indication of which source file or function triggered the error. Diagnosing required grep-ing the codebase for the SQL string.
## Goal
WARN and ERROR log lines include the source file and line number. INFO and DEBUG remain unchanged.
## Approach
Create a custom `tracing_subscriber` event formatter that conditionally appends `[file:line]` when the event level is WARN or ERROR.
### New file: `backend/src/logging.rs`
~30 lines. Implements `FormatEvent` trait:
- For WARN/ERROR: appends `[src/file.rs:123]` after the target module
- For INFO/DEBUG/TRACE: standard format, no file:line
### Changes to `backend/src/main.rs`
Replace:
```rust
fmt().with_env_filter(filter).init();
```
With:
```rust
fmt().with_env_filter(filter).event_format(logging::ErrorLocationFormat).init();
```
Add `mod logging;` to `main.rs` (alongside the existing `mod cli;` — both are binary-only concerns).
### Output examples
**INFO (unchanged):**
```
2026-03-23T10:00:00Z INFO ai_synth_backend::services::auth: Magic link token created email="test@example.com"
```
**ERROR (with file:line):**
```
2026-03-23T10:00:00Z ERROR ai_synth_backend::errors [src/errors.rs:91]: Database error: PgDatabaseError { ... }
```
**WARN (with file:line):**
```
2026-03-23T10:00:00Z WARN ai_synth_backend::handlers::auth [src/handlers/auth.rs:75]: Rate limit exceeded for email
```
## What does NOT change
- No changes to any `tracing::error!` or `tracing::warn!` call sites
- No changes to error types or error handling logic
- No changes to the JSON error response sent to clients
- INFO/DEBUG/TRACE output format unchanged
## Testing
- `cargo test --lib` — existing tests pass (formatter is only used in main.rs, not in tests)
- Manual: run the app, trigger an error, verify file:line appears in log output