Exceptions are multi-line by nature. A java.sql.SQLException arrives as a headline followed by a tower of at com.example... frames and a Caused by: chain; log4j wraps a single message across several lines; Python prints a full traceback from Traceback (most recent call last): down to the raised exception. Splitting such a file naively by newline — in a spreadsheet, a log viewer, or a shell one-liner — destroys the story: one exception becomes a dozen unrelated rows, none of which mean anything on their own. Multi-Line Log Parser puts the story back together, entirely in your browser.
Tell the parser where entries begin — an ISO timestamp (2025-06-11T10:00:01Z), a bracketed timestamp ([2025-06-11 10:00:00]), a leading log level (ERROR/WARN/INFO...), a line that opens with a JSON brace, or your own regular expression — and every following line that does not itself look like a new start is attached to the entry above it. Blank lines inside a stack trace stay part of that entry too, so the line count you see matches what was actually in the file. The result is a table of whole events, not fragments: each row carries its start line number, the detected timestamp and level, a truncated headline for scanning, and the total number of lines — headline plus every continuation — that make up that entry.
This matters most when triaging incidents. A raw log tail interleaves exceptions from many different requests; without reassembly you cannot tell which stack frame belongs to which failure, or how many lines a particular crash actually spans. Once entries are rebuilt you can scan the level badges, search across full bodies including deeply nested frames, and immediately see which exception recurs most often.
Lines that appear before the very first matching start — a banner, a partial line left over from log rotation, output from a tool that does not use your chosen start pattern — have nothing to attach to. Rather than merging them into whatever entry comes next (which would corrupt that entry’s body), the tool lists them separately as orphan lines so you can see exactly what was left over and decide whether the start pattern needs adjusting. The level mix across all reconstructed entries is summarized as color-coded badges with percentages, live search filters the table by headline, body text, detected time or level as you type, and every entry can be exported with its full multi-line body intact — as CSV for a spreadsheet or JSON for a script. Nothing is uploaded: the log never leaves the tab it is pasted into.