log lens for vs code
Open VSXVisual Studio Marketplacefree viewer, Pro by subscription
Install from Open VSXInstall from the Visual Studio Marketplacefree to read; the Pro trial runs 30 days on each machine
The log goes on for miles in the editor. Take the rope into VS Code. What stays in memory is the index of offsets, not the miles of text, and a line is read off the disk when you scroll to it.
Log Lens is the third extension we have built for VS Code; JSONL Lens and Parquet Lens came first. It opens a .log file in the editor. The rotated .log.1 to .log.N files of a set open the same way, and so does a .log.gz. Lines are indexed by byte offset in one pass, so a multi-gigabyte log is on screen while its index builds.
ERROR, WARN, INFO, DEBUG and TRACE are read from each line and counted over the whole file. The count is a second pass that begins once the index is complete, and the chips wait for it. A chip per level narrows the grid to that level. The file's first 64 lines decide its format. JSON lines and logfmt are recognized there with nothing to configure, and anything else reads as plain text. The ANSI escape codes a container log carries are stripped from the grid and painted in the line detail.
Reading is free: the grid, the chips, the search box in the grid with regular expressions and the line detail. Pro, a subscription shared with JSONL Lens and Parquet Lens for VS Code, adds whole-file filter queries, export to .log, JSONL or CSV, log statistics and grid themes. It is on from the first open, since each machine gets a 30-day trial with no key to enter.
- opens
- .log, .out and .err files, rotated .log.N files with a suffix of up to nine digits, and the .gz form of each; a .txt file stays with the text editor
- runs on
- VS Code 1.90 and every later release, with no upper bound; the Open VSX build serves VSCodium and the other editors that use that gallery
- stores
- Open VSX and the Visual Studio Marketplace
- newest version
- 0.2.15, published 2026-10-17 on both stores
- pro
- one subscription from Polar, one key for the three extensions; a 30-day trial on each machine first
free
- Any size: a line index built in one pass with live progress; browse lines while indexing runs
- Follow the end: switch follow on and the file is read as it grows; each new line is indexed and given its level as it lands, the counts and the chips keep up, and the grid stays at the last line; a file cut back or replaced by a shorter one stops follow with a sentence saying so
- Log levels: ERROR, WARN, INFO, DEBUG and TRACE read from each line and counted over the whole file; a chip per level narrows the grid to that level
- Formats: JSON lines and logfmt recognized from a sample of the file, plain text otherwise; the level, the time and the message read under all three
- ANSI: the escape codes in a container or CI log stripped from the grid and painted as colors in the line detail
- Compressed and rotated: a .log.gz unpacked once to a temp file that goes with the tab; app.log.1 and the rest of a rotated set open like any log
- Encodings: the first 64 KB decide how the file is read; UTF-8 is read in place, and UTF-16 with a byte order mark, EUC-KR, Shift_JIS, EUC-JP, GB18030, Windows-1250, ISO-8859-2, CP852, Windows-1252, Windows-1254 and Windows-1251 are recognized from their bytes and decoded once to a UTF-8 copy, which the grid, find and the exports then read; the statistics tab names the encoding
- Find in file: full-text search or a regular expression tested against each line, a case toggle, next and previous, and matches only to page through the hits alone
- Go to row: type a line number, Enter, and the grid is there (Ctrl+G for the box)
- Line detail: the selected line whole, a JSON line pretty-printed, an ANSI line in its colors, copied in one click
- Statistics tab: the level counts over the whole file and the file's shape; the time span and the activity histogram wait behind the Pro full scan
- Reads in place: a plain UTF-8 file is used where it lies, never copied or converted; the index is thrown away when the tab closes
- Private by construction: no account, no telemetry; the free viewer makes no network calls
pro
- Whole-file filter queries:
$level == "ERROR" && $message contains "timeout", tested against every line in the file, the parsed fields of a JSON or logfmt line included; the grid becomes the matching set - Export: all lines, the lines in view under the level chips and the filter, or the search matches, to .log, JSONL or CSV, with a cancellable progress bar, never over the source file
- Log statistics: the full scan of the statistics tab: the first and the last timestamp in the file, the span between them and a histogram of lines across it, with the undated lines counted apart
- Themes: twelve looks for the grid, each tuned for light and dark editors; trying one is free for the window, keeping it is Pro
price, as the store shows it
$4.90 a month or $49 a year personal, $9.90 a month or $99 a year business: one key for all three extensions, and Pro stays on in every build while the subscription runs. a personal key activates on up to 3 machines, a business key on 10, all three extensions on each (each extension on each machine is one activation: 9 on the personal key, 30 on the business key); release a machine from the Polar customer portal. when the subscription ends, Polar revokes the key and Pro turns off at the extension's next check, about once a week; the free viewer stays.
the key
one Lens Pro key covers Log Lens, JSONL Lens and Parquet Lens for VS Code, but the three do not pass the key between them. paste it into each one you use; Remove license key in that extension releases it again.
The keys are sold through Polar as a personal key or a business key, and the same key serves the other two Lens extensions for VS Code. The price is on the Lens Pro page.
Pasting a key under Enter license key is one activation call to Polar, a license check follows about once a week after that, and answering Remove license key with Release and remove is one release call; Remove only skips it. While Polar cannot be reached, the check is tried again at every start and once a day. The trial needs no call, and a filter query works on the file on your disk and stops there. Get Lens Pro hands the checkout to your browser, and Write a review does the same with the store page.
where it stops
- Follow on a .gz: refused by name; it is read from a copy made when the tab opened, and a copy does not grow with the file; open the plain log to follow it
- Follow under matches only: that toggle pins the grid to the hits of the last search, so lines that arrive after it join the file and the counts, not that pinned list; run the search again to take them in
- Jump to source: absent; a stack-trace line is text, with nothing in it linked into a project
- Other encodings: a file in an encoding not on the list above (UTF-16 without a byte order mark, for example) reads as UTF-8 with its letters outside ASCII wrong, and there is no selector to correct it by hand
- Editing: the log is never modified, truncated or rotated
- Remote files: local files only, so no ssh tailing, no aggregation, no shipping
what's new
- 0.2.15published 2026-10-17
a CSV export (Pro) now writes a leading apostrophe into any field that starts with =, +, - or @, or with a tab or a carriage return, and is not a plain number: the message, the level, the time or a named field alike. =cmd|x is written as text; a field that is only -1 stays the number -1. the export also refuses a hard link of the log as its destination, with the sentence "Export destination is the source file under another name (a hard link, or the same path in another case)"; the log's own path and a symbolic link to it were refused before, and a write through a hard link would have emptied the log while it was being read.
- 0.2.14published 2026-10-17
a UTF-8 log with a few damaged spots now opens as UTF-8 while its well-formed letters past ASCII outnumber the bad sequences eight to one; one stray byte used to send the whole file to the double-byte vote, which read a Polish log as Korean (EUC-KR) and turned its ą, ę and ł into other characters. a .log, .out or .err file over 5 MB, app.log.3 and the other numbered rotations included, or any gzipped one, that a double click opened as text now draws one question, "Open service.log in Log Lens?", with "Open", an "Always for" button that names the ending (.log, .out or .err) and "Not now": "Always" makes Log Lens the editor for that ending in your user settings, .log bringing its numbered rotations along, the question is asked once per ending on this machine, and never for an ending that already has an editor. a file of another format opened in Log Lens, a Parquet, Avro or Arrow file, a SQLite database, a ZIP archive such as an .xlsx workbook, or gzip under a name without .gz, is refused in one line, Not a log file: "app.db" is a SQLite database., where the grid showed its bytes as lines of noise. the line "part of it is damaged, or laid out in a way this viewer cannot follow" now covers a log the reader cannot place, its own message in the tooltip.
- 0.2.13published 2026-10-14
a search that fails, because the file could not be read for example, now says why in the search bar, where it stayed on "Searching..." for good. a webview the editor reloads (a tab hidden and shown again) hears the file as it was, with its count, instead of being indexed a second time, which doubled the count. a read that fails after the file opened (a page of rows, a detail) now says why in the status line too, where the grid waited on it for good.
more
- every format, every product
- reading a multi-gigabyte log in place
- the exports
- the JetBrains edition, with follow mode and jump to source
- Lens Pro for VS Code, the one key
- support
Pricing, invoices and licensing questions go to sales@twilightventures.dev; anything else about the product to support@twilightventures.dev.