Skip to main content

Troubleshooting

401 Unauthorized on every request

An API key is configured (LOG_LENS_TOKEN / auth.token) and the request didn't present it. Send X-Log-Lens-Token: <token> or Authorization: Bearer <token>. In the dashboard, use the header key button to enter/change it. See Security.

403 Cross-origin request blocked

A state-changing request arrived with an Origin whose host ≠ the request host. Make the SPA and API same-origin, or (for non-browser clients) omit the Origin header. This is the CSRF guard, working as intended.

419 on writes (in Laravel)

This is handled automatically now: the dashboard reads Laravel's XSRF-TOKEN cookie and sends it as the X-XSRF-TOKEN header, so writes pass the web middleware CSRF check. If you still see a 419, make sure the routes keep the web middleware group in config/log-lens.php (it's what issues the XSRF-TOKEN cookie), and that cookies aren't stripped by a proxy.

An unauthenticated / incognito tab can open the dashboard (Laravel)

Expected in the local environment with no gate configured (the default is local-open). Register LogLens::auth(fn ($r) => $r->user() !== null) to require login even locally. See Laravel Package.

Blank page / 503 "UI has not been built"

The frontend build is missing. Standalone: cd frontend && npm ci && npm run build ( to packages/core/public/ui). Laravel: npm run build:laravel then php artisan vendor:publish --tag=log-lens-assets.

Dashboard loads but assets 404 (Laravel)

Assets weren't published, or were rebuilt without re-publishing. Run php artisan vendor:publish --tag=log-lens-assets --force. They must live at public/vendor/log-lens/assets/.

"The archived source file is unavailable" on raw fetch

The processed/ file backing that occurrence was removed (e.g. by retention). The indexed issue and counts are intact; only the raw body is gone. Re-import the file if you need the raw evidence.

No issues after importing

Only severities on the workspace allowlist are indexed (default ERROR + WARNING). Enable more under Settings to Ingestion, then reindex. Also confirm the file matched ingestion.log_file_pattern.

Timestamps look wrong / everything on one day

The parser couldn't read the event's timestamp and fell back to import time. Check the log format matches a supported format; for custom formats, the generic console parser needs a bracketed or ISO timestamp.

"database is locked" / duplicate-column on first request after upgrade

Fixed: migrations are serialized with an immediate write lock and gated by PRAGMA user_version, and busy_timeout is set before the WAL switch. If you somehow still hit it, ensure only one process performs the very first initialization, or raise database.busy_timeout.

Moved the folder and paths broke

They self-heal: SourcePathRepairService re-points stored paths on the next request by matching file size. If a file's size changed while moving, re-import it.