Skip to main content

Supported log formats

Log Lens ships with five parsers. For each file it reads a sample (the first ingestion.sample_bytes, default 65536 bytes) and asks each parser, in order, whether it supports the file. The first match wins.

The five formats

TypeStored typeDetected when
Horizon (Laravel-framed)horizonFilename contains horizon and the sample matches the Laravel header
Horizon (console output)horizonFilename contains horizon and the sample matches either shape horizon/queue:work prints
nginx accessnginx_accessFilename contains access or nginx and the first line matches the combined log format
LaravellaravelFilename does not contain horizon and the first line matches the Laravel header
ConsoleconsoleFallback - always matches

Both Horizon parsers verify the framing before claiming a file, so a horizon-named log in neither shape falls through to the Console parser instead of parsing to nothing. Because Console always matches, any text file is ingestible; it is only chosen when the four specific parsers decline.

Laravel and Horizon

A Laravel entry begins with a header line and may span multiple lines:

[2026-07-25 14:03:11] production.ERROR: Something failed
#0 /app/... stack trace continues

The timestamp, environment (production), level, and message are captured. Trailing lines are appended to the body until the next header. A horizon.log written through Laravel's logging stack has exactly this framing, and is split out by filename so it carries the horizon type.

A worker log captured straight from the console instead (horizon or queue:work writing to a file, or a process manager's stdout log) has no Laravel framing and no log level at all, in one of two shapes:

[2026-08-20 03:00:02][7f3a1c2e] Failed: App\Jobs\SyncCustomer
2026-08-20 03:00:02 App\Jobs\SyncCustomer .................... 1s FAIL

Since neither shape carries a level, the verb is the level: Failed/FAIL (or an exception class where the verb would be) is an ERROR, and every other line is INFO progress. Unheaded lines — Stack trace:, #0 /app/…, the exception message — append to the event above them, so a failure keeps the trace that explains it. Both shapes store the horizon type and the horizon environment.

nginx access

Standard combined format is parsed into IP, method, path, status, bytes, referer, and user agent. The message is rendered as HTTP <status> <method> <path>.

Console and custom logs

The Console parser tries three header patterns (a bracketed [time] LEVEL: body, an ISO-timestamp-with-level line, and a bare [time] body), then falls back to treating each line as an INFO event stamped with the file's modified time. Unheaded continuation lines attach to the preceding event.

Severity mapping

Levels are uppercased and normalized:

RawStored as
WARNWARNING
ERR, FATALERROR
TRACEDEBUG
anything else / emptyitself, or INFO

nginx has no level field, so severity is derived from the status code:

StatusSeverity
>= 500ERROR
400-499WARNING
below 400INFO

Multi-line bodies are captured up to ingestion.capture_limit (default 4 MiB); anything beyond that is truncated.