v1.0 · for Laravel 8 → 13

From 12,000 logs
to 3 issues triaged.
Before your coffee.

Owlogs ingests every Laravel log, event, queued job and notification, fingerprints them into deduplicated issues, and feeds your AI editor through MCP. Search hybrid. Triage with a kanban. Open a GitHub issue from the chat — with the full trace inside.

12,847
log entries / 24h
3
open issues
1
PR drafted by AI
composer require owlogs/laravel MCP server included EU-hosted · GDPR-compliant
storage/logs/laravel.log
tail -f
[2026-04-19 14:32:07] production.INFO: POST /orders/428/refund uid=1184
[2026-04-19 14:32:07] production.DEBUG: select * from "orders" where "id" = $1 [428] (1.8ms)
[2026-04-19 14:32:07] production.DEBUG: select * from "users" where "id" = $1 [1184] (0.9ms)
[2026-04-19 14:32:07] production.DEBUG: OrderPolicy@refund authorized for 1184
[2026-04-19 14:32:07] production.INFO: Event [OrderRefundRequested] dispatched
[2026-04-19 14:32:07] production.DEBUG: Listener SyncRefundWithStripe queued on "payments"
[2026-04-19 14:32:07] production.DEBUG: Listener LogAdminAction executed synchronously
[2026-04-19 14:32:07] worker.INFO: Processing [SyncRefundWithStripe] id=job_8a2f
[2026-04-19 14:32:08] worker.WARNING: Stripe API latency=892ms (> 500ms)
[2026-04-19 14:32:08] worker.ERROR: Stripe\CardException in StripeGateway.php:87
at app/Jobs/SyncRefundWithStripe.php:42
at app/Listeners/SyncRefundWithStripe.php:19
[2026-04-19 14:32:08] worker.DEBUG: Job failed, released back to queue (attempt 1/3)
[2026-04-19 14:32:08] production.INFO: Notification RefundFailed skipped — user opt-out
[2026-04-19 14:32:08] production.INFO: Response 202 (1.12s) to user 1184
owlogs · workflow #wf_428a82f
⌘K search
POST /orders/428/refund 202 1.12s user #1184
HTTP POST /orders/428/refund · user #1184 +0.00s
SQL SELECT orders WHERE id=428 (1.8ms) +0.00s
SQL SELECT users WHERE id=1184 (0.9ms) +0.00s
DEBUG OrderPolicy@refund → authorized +0.01s
EVENT Event fired · OrderRefundRequested +0.02s
QUEUE Queued job · SyncRefundWithStripe on "payments" +0.02s
JOB Job started · SyncRefundWithStripe #job_8a2f +0.18s
WARN Stripe API latency 892ms (slow) +0.90s
ERR Stripe\CardException · StripeGateway.php:87 +1.10s
NOTIF Notification skipped · RefundFailed (user opt-out) +1.11s
5K+
logs / second ingestion
37
MCP tools your AI can call
5
specialised sub-agents
<5 min
install to first workflow

Every log. Every job. Every notification.

A Laravel request fans out across events, listeners, queues and notifications — often across workers and days. Owlogs ingests the firehose, fingerprints what matters, and hands the rest to your AI.

WORKFLOW GROUPING

One request. One workflow.

We follow the causal chain: HTTP request → controller → dispatched events → listeners → queued jobs → notifications → mails. Every piece gets stitched together, even when a job finishes hours later on another worker.

HTTP POST /orders/428/refund 202 · 1.12s
EVENT OrderRefundRequested 3 listeners
QUEUE SyncRefundWithStripe "payments"
JOB Stripe\CardException attempt 1/3
VERBOSE INGESTION

Ship it all.

Every channel, every level — DEBUG, SQL, worker logs included. One service provider, zero config, no sampling.

VECTOR SEARCH

Ask, don't grep.

Every workflow is embedded and indexed. "Refunds that silently dropped a notification last week" returns workflows, not log lines.

MCP SERVER

In your editor, natively.

A built-in MCP server lets Claude Code, Cursor or Zed pull workflows, errors and traces directly — no copy-paste.

$ owlogs mcp://workflows?user=1184
MARKDOWN EXPORT

Ready for the AI.

One click dumps the whole workflow: timeline, stack traces with file + line, payloads, job metadata. Paste, fix, ship.

BUILT-IN REPORTS

Exceptions, N+1, slow queries — flagged automatically.

Owlogs scans every workflow as it lands. Repeated exceptions get grouped. N+1 patterns are detected from SQL traces. Slow queries and slow jobs are surfaced with their source workflow one click away.

EXCEPTIONS
Stripe\CardException
18this week
N+1 QUERIES
ProductController@index
7this week
SLOW QUERIES
orders.listForAdmin()
3this week
SLOW JOBS
RebuildSearchIndex
2this week

12,000 logs in. Three issues out.

Every batch is fingerprinted automatically. Exceptions, N+1 patterns and slow queries group themselves into deduplicated issues — ready for a Monday-morning kanban with drag, pin, snooze, bulk move and undo.

Open 4
EXCEPTION
Stripe\CardException
8,432 occurrences2h ago
N+1
N+1 on GET /api/orders
412 traces19 min ago
SLOW QUERY
orders.listForAdmin()
1.4s avgtoday
EXCEPTION
RuntimeException · queue
118 occ.4h ago
Resolved 2
EXCEPTION
PDOException · payments DB
fixed by @kevyesterday
SLOW QUERY
reports.export() 4.2s
index added2d ago
Ignored 2
N+1
N+1 admin dashboard
low traffic7d snooze
EXCEPTION
ValidationException
expectedsilenced

Four steps. Maybe five minutes.

A real install: composer in, key out, MCP wired, first workflow visible. Same flow whether you're on local, staging or production.

app.owlogs.io / acme-api / onboarding • connected
Install
Configure
MCP
Verify
STEP 01 · INSTALL

Add the package.

One composer command. The service provider auto-registers, intercepts your Monolog stack, and forwards every channel — DEBUG and SQL included.

Service provider auto-registered
Monolog channels intercepted
Query logger · job listener · event tap wired
Continue → ~ 30 seconds
STEP 02 · CONFIGURE

Drop your API key.

Generate a workspace key, paste it into your .env. Pick the environments you want to scope (production, staging, local).

production staging local
Continue → ~ 1 minute
STEP 03 · MCP

Connect your AI editor.

Generate a personal token, paste the snippet into Cursor / Claude Code / Zed. Your agent gains 37 tools — search, traces, top issues, GitHub issues.

Cursor Claude Code Zed Windsurf
Continue → ~ 90 seconds
STEP 04 · VERIFY

See your first workflow.

Ship a request. Owlogs stitches logs, events, queues and notifications into one trace. The kanban surfaces fingerprinted issues automatically.

workflow #wf_428a82f · POST /orders/428/refund just now
Finish → ~ 30 seconds
~/acme-api· bashcopy
# Add Owlogs to your Laravel app $composer require owlogs/laravel # Publish the config (optional) $php artisan owlogs:install
.envcopy
OWLOGS_KEY=owl_live_a82f3c… OWLOGS_ENV=production OWLOGS_SAMPLE=1.0 # That's it.
~/.cursor/mcp.jsoncopy
{ "mcpServers": { "owlogs": { "url": "https://mcp.owlogs.io/v1", "headers": { "Authorization": "Bearer owl_pat_…" } } } }
first workflowlive
// owlogs.app/acme-api/logs POST /orders/428/refund → 202 ├─ EVENT OrderRefundRequested ├─ QUEUE SyncRefundWithStripe ├─ ERROR Stripe\CardException └─ NOTIF RefundFailed · skipped # 1.12s · user #1184
In development

See every query, event and job your code fires — without spinning up Telescope. Debug the full chain locally.

In testing / QA

"User says notification never arrived." Open the workflow, see the guard that skipped it, ship the fix.

In production

An exception fires: jump from the error to the originating HTTP request, see every side effect, export to AI.

Follow the thread. All the way to the job.

A single workflow view from the HTTP request down to the notification that never fired — searchable, MCP-ready, one click to Markdown.

/ Owlogs/ Logs

Logs

All environments 184 entries 4 warnings
08:32:0208:32:30
ERROR WARN INFO DEBUG NOTICE EVENT QUEUE NOTIF
POST api.acme.dev /orders/428/refund
3 08:32:07
+0ms INFO OrderController.php:42 OrderPolicy@refund → authorized 08:32:07
+2ms DEBUG events.php:18 Event dispatched · OrderRefundRequested 08:32:07
+4ms DEBUG queue.php:91 Queued · SyncRefundWithStripe on "payments" 08:32:07
QUEUE acme-api SyncRefundWithStripe
4 08:32:08
+0ms DEBUG SyncRefundWithStripe.php:24 Job started · attempt 1/3 08:32:08
+2ms NOTICE StripeGateway.php:62 POST https://api.stripe.com/v1/refunds 08:32:08
+4ms WARN StripeGateway.php:78 Upstream latency 892ms (over 500ms threshold) 08:32:08
+6ms ERROR StripeGateway.php:87 Stripe\CardException: Your card was declined. 08:32:08
NOTIF acme-api RefundFailed
1 08:32:08
+0ms INFO RefundFailed.php:28 Skipped · user #1184 opted-out of billing.refund_failed 08:32:08

A chat. Thirty-seven tools. One copilot.

The workspace chat is a real agent — it calls search_logs_hybrid, opens issues, summarises stacktraces, compares deploys. Streaming SSE, multi-user conversations, Fast or Deep mode per thread. Owlogs runs the AI — you just ask.

acme-api · why is checkout slow? live
Why is checkout slow today?
search_logs_hybrid ("checkout slow") ✓ 47 results
top_issues (env: prod, since: 24h) ✓ 3 issues
summarize_stacktrace (trace_id: a82f) ✓ done
RootCauseExtractor · 1.8s
Checkout latency jumped at 14:32. Cause: Stripe API upstream — p95 went from 220ms → 892ms. 412 requests degraded. Want me to open a GitHub issue?
Ask anything about your logs…
Sub-agents
StacktraceSummarizer Compresses 10 KB of stack into 200 tokens.
RootCauseExtractor One-line hypothesis from a trace.
TraceNarrativeSummarizer 2-paragraph story per workflow.
GithubIssueDraftAgent Drafts issue body from a trace.
MermaidFixerAgent Repairs broken Mermaid syntax.
Fast modeDeep modeWorkspace-scopedStreaming SSE

A trace your AI can actually fix.

One button on every workflow. The exporter assembles metadata, the full timeline, stack traces with file + line, context payloads, performance measures and breadcrumbs — then runs every secret through a redactor before it ever leaves the box.

Markdown copied · 4.2 KB

One trace. The whole story.

The same exporter feeds the chat agent, the GitHub issue drafter and the MCP tools. Pay the assembly cost once, paste it everywhere.

Redacted before export password · token · key · secret Authorization headers, cookies, sessions Email addresses (masked, not removed) Credit-card patterns
Paste-ready for
Claude CodeCursorZed Claude DesktopChatGPTGitHub issue
Copy for AI
trace-01KRQ…FAT4TV.md
✓ PII-safe 4.2 KB md

# MapleDesk Trace Export

Exported 2026-05-16 08:43 · 1 trace

AI Instructions

Read the referenced files for source context, then analyse the error summary, stacktraces and log entries below to propose a fix.

app/Events/OrderUpdated.php app/Jobs/CalculateOrderPriorityActions.php app/Jobs/Quote/GenerateQuotePdfJob.php app/Listeners/Quote/GenerateQuotePdf.php app/Listeners/Quote/NotifySubscribersOfNewQuote.php app/Listeners/Slack/SendNewQuoteCreatedSlackNotification.php app/Notifications/Quote/QuoteReceivedPending.php

Trace `01KRQ…FAT4TV`

Originhttp
URIPOST /contractor/orders/019e2bbb…/quote
Environmentproduction
AppMapleDesk
Git SHA`19f9dc58`
IPredacted
Queuedefault · attempt 1
Peak Memory55 MB
Duration2.04 s
Entry Count46

User Context

{ "id": "019c5b6e-edb3-720e-9811-2216f4867365", "email": "b***@***.com", "account_type": "contractor", "onboarded": true, "two_factor_enabled": false }

Request Input

{ "lines": [ { "qty": 1, "description": "Labour · install camera", "unit_price": 6500 }, { "qty": 1, "description": "Site travel", "unit_price": 6500 } ], "deposit_percentage": 0, "api_key": "redacted" }

Log Entries

07:28:37.432 INFO job.dispatched: CalculateOrderPriorityActions
07:28:37.432 INFO job.started: CalculateOrderPriorityActions
07:28:37.433 ERR job.failed: DispatchOrderNotificationSent — No query results for [Quote]
07:28:37.434 INFO event.dispatched: QuoteCreated
07:28:37.436 INFO Order quote created
07:28:37.436 ERR job.exception: SendOrderStatusOnQuoteSent — ModelNotFoundException
07:28:37.438 INFO job.started: SendNewQuoteCreatedSlackNotification
07:28:37.440 INFO job.started: NotifySubscribersOfNewQuote
07:28:37.440 INFO job.started: GenerateQuotePdf
07:28:37.444 INFO job.dispatched: SendQueuedNotifications
07:28:37.450 INFO job.dispatched: GenerateQuotePdfJob
07:28:37.451 INFO User notification dispatched
07:28:37.490 INFO event.dispatched: OrderUpdated
07:28:37.493 INFO mail.sending: r***@***.com — "Your quote has arrived"
07:28:37.652 INFO notification.sent: QuoteReceivedPending via mail
07:28:37.740 INFO notification.sent: NewQuoteCreated via slack
07:28:39.005 INFO job.started: GenerateQuotePdfJob
07:28:39.447 INFO Quote PDF generated
07:28:39.475 INFO job.completed: GenerateQuotePdfJob

Context · job.failed: DispatchOrderNotificationSent

{ "job": "App\\Listeners\\DispatchOrderNotificationSentOnQuoteCreated", "queue": "default", "attempt": 1, "exception_class": "Illuminate\\Database\\Eloquent\\ModelNotFoundException", "exception_file": "vendor/laravel/framework/.../Builder.php:780", "model": "App\\Models\\Quote" }

Context · event.dispatched: QuoteCreated

{ "event": "App\\Events\\Quote\\QuoteCreated", "quote_id": "019e2faf-e621-71a2-abf1-90f482d1e71a", "event_file": "app/Events/Quote/QuoteCreated.php" }

Performance Measures

s3.upload318.5 ms
pdf.render442 ms
mail.dispatch207 ms

Breadcrumbs

  • OrderActivityController@createQuote
  • ContractorOrderService@createQuote
  • SendBobdeskNoteOnQuoteCreated
  • CalculateOrderPriorityActionsOnQuoteCreated
Paste into your AI — it has the files, the failure, and the timing.

An MCP server your editor already speaks to.

Connect once. Your AI can pull workflows, exceptions, slow queries and stack traces directly — no screenshots, no copy-paste, no missing context.

Claude Code

→ native MCP client

Cursor

→ MCP via settings

Zed AI

→ MCP slash command

GitHub Copilot

→ paste Markdown export

// ~/.config/claude-code/mcp.json { "mcpServers": { "owlogs": { "url": "https://mcp.owlogs.io/v1", "headers": { "Authorization": "Bearer " } } } }

From a stacktrace to a triaged issue. Without leaving the chat.

Install the GitHub App on any org. Owlogs mints scoped JWTs on the fly — no stored tokens. Issues flow back too: every internal issue tracks its GitHub number + state, kanban filters by linked / unlinked.

01
Pick an issue

From the kanban or the chat, ask the agent to open one.

★ Stripe\CardException · 8,432 occ.
02
AI drafts the body

Symptom, suspected cause, steps to reproduce — plus the full trace in a collapsed <details> block.

## Symptom
Checkout fails ~892ms…
<details> trace_id=a82f </details>
03
Pushed to your repo

Per-repo write toggle. The issue gets github_issue_number back; status syncs both ways.

✓ acme/api#142 opened · assigned

Built for teams that care about audit.

Owlogs is multi-tenant by construction. Logs never leave your shard, secrets never touch our DB, every sensitive action is logged with a user id and timestamp.

TENANCY
Postgres shards

Stancl/Tenancy with per-workspace database. Tiered shards route US to US, EU to EU.

AUTH
2FA, Passkeys, OAuth

TOTP, recovery codes, WebAuthn passkeys, GitHub / Google login or linking.

RBAC
4 roles, audit trail

Owner / Admin / Member / Billing. Every role change tracked via Spatie ActivityLog.

TOKENS
Scoped API keys

Named tokens per workspace (Production, Staging, CI) — revoke independently.

REDACTION
PII-safe Markdown

Auto-redact password / token / key fields before any AI export.

QUOTA GATE
Redis O(1)

Quota checked in O(1) before ingestion — no DB hit, no rate-limit surprise.

TRACEABILITY
Activity Log

Export 6 months of workspace activity to CSV for compliance.

HOSTING
EU-hosted

Primary region in EU · GDPR-compliant data centres · daily encrypted backups.

Priced by volume. Not per seat.

Every plan includes unlimited team members and every feature. Pay for what you log.

Starter
€11/ month, excl. tax
  • 6.2 M logs / month
  • 8 M owlogs tokens / month
  • 7 days DEBUG/INFO retention
  • 30 days WARNING/ERROR retention
  • Unlimited semantic search
  • Standard AI chat
Get started
Business
€30/ month, excl. tax
  • 60 M logs / month
  • 20 M owlogs tokens / month
  • 60 days DEBUG/INFO retention
  • 180 days WARNING/ERROR retention
  • Multi-project, unlimited team members
  • Audit log (compliance-friendly)
Get started

Common questions.

How do I send my Laravel logs to Owlogs?
One line in composer.json, set OWLOGS_KEY in your env, and we hijack your Monolog stack. Two minutes to first workflow — every channel, every level, including DEBUG and query logs.
How does the AI search actually find things?
Three layers : exact-match via PostgreSQL tsvector, semantic similarity via pgvector embeddings, and a Reciprocal Rank Fusion that mixes both, finally reranked for relevance. Hash-deduplication keeps embedding costs minimal.
What about my AI editor — Cursor, Claude Code, Zed?
Owlogs ships an MCP server. Install the app, generate a personal token, paste the snippet into your IDE config. Your AI gains the same 37 tools the workspace chat uses : search_logs_hybrid, get_trace, top_issues, github_create_issue and more.
Will I leak secrets to the AI?
The Markdown exporter and every MCP read auto-redact password, token, key, secret and credit-card patterns before anything leaves the box. The chat agent uses the same exporter — paid once, applied everywhere.
Where is my data hosted?
EU region by default — GDPR-compliant data centres, encrypted at rest, daily backups. Each workspace runs on its own Postgres shard so logs never cross tenant boundaries.
What about pricing on a real spike?
Plans include a generous monthly workflow budget. Overage is metered (no plan upgrade required) and shows in the upcoming-invoice summary before you're billed. Quota Gate runs in Redis (O(1) per ingest), so a 5K-logs-per-second event won't accidentally cost you a fortune.
ERROR Stripe\CardException WARN upstream 892ms INFO OrderPolicy@refund QUEUE SyncRefundWithStripe NOTICE POST /v1/refunds NOTIF RefundFailed Owlogs mascot — a friendly owl watching your Laravel logs

Stop grepping.
Start reading workflows.

14 days free. No credit card. Two minutes to stitch your first Laravel request end-to-end — and hand it to your AI.

Start free → Read the docs