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.
68 lines
2.1 KiB
Markdown
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
|