Log lines, kept as lines.
Searchable, filterable, tailed live, and never merged. A log explorer that folds two identical lines into one is lying about what happened, and the one thing you need from logs at three in the morning is that they are literally true.
Everything that can POST can ship logs here
A Laravel log channel, an OpenTelemetry exporter, a shell script with curl in it, or a log shipper posting NDJSON. All four arrive as the same normalised record, which is why search, filtering and alerting are written once and behave identically whatever sent the line.
Lines carry their level, their timestamp as the sender recorded it, and whatever structured context came with them. Nothing is reformatted on the way in.
Live tail
Follow a project while you deploy, with the filter still applied.
Alert on a line
A rule that matches text and fires the same way an error alert does.
Bulk inserted
A batch of a thousand lines is one write, so shipping logs does not cost you latency.
Retention you set, on storage you own
Log volume is the part of observability that gets expensive by accident, usually because somebody left debug on in production over a weekend. Here the retention window is yours to set per collector, the quota is published, and going over it refuses and counts rather than quietly billing you.
Questions people actually ask
Are logs grouped like errors are?
No, deliberately. Two identical lines are two things that happened. Grouping them would make the count wrong, and the count is the reason you are reading logs.
Can I search structured context?
Yes, the context that came with the line is stored with it and is filterable alongside the level, the project and the time range.
Fourteen days of Team, without a card.
Sign up with your work address, prove your domain with one DNS record, and paste a DSN. The first stack trace usually arrives before the coffee does.
No card. The trial ends by itself and drops to Free; nothing is charged unless you choose a plan.