logana 0.5.0

A TUI log analyzer/viewer built for speed - handles files with millions of lines with instant filtering and VIM like navigation.
Documentation

logana

A fast terminal log viewer for files of any size — including multi-GB logs. Built on SIMD-accelerated line indexing, search, and filtering. Auto-detects log formats, filters by pattern, regex, field value, or date range — bookmark lines, add annotations, and export your analysis.


Performance

Headless mode

Benchmarked against lnav with headless mode filtering a 3.3 GB web server access log with 10 million+ lines, with a cold disk cache, measured on 10 runs.

logana

$ hyperfine --prepare 'rm filtered.log;sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' \
  'logana ~/logs/access.log -i food --headless > filtered.log' --runs 10

Benchmark 1: logana ~/logs/access.log -i food --headless > filtered.log
  Time (mean ± σ):     999.9 ms ±   2.9 ms    [User: 2277.7 ms, System: 3057.0 ms]
  Range (min … max):   995.2 ms … 1003.6 ms    10 runs

lnav

$ hyperfine --prepare 'rm filtered.log;sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' \
  'lnav ~/logs/access.log -c ":filter-in food" -n > filtered.log' --runs 10

Benchmark 1: lnav ~/logs/access.log -c ":filter-in food" -n > filtered.log
  Time (mean ± σ):     11.197 s ±  0.140 s    [User: 14.177 s, System: 1.580 s]
  Range (min … max):   10.980 s … 11.483 s    10 runs

logana is ~11× faster than lnav.

The headless mode was used for more reliable measurements.

TUI

Same 3.3GB file with the TUI (filter passed as command argument, quit once data was fully loaded and filter applied):

$ time logana ~/logs/access.log -i food
logana ~/logs/access.log -i food  5.21s user 3.61s system 197% cpu 4.475 total

$ time lnav ~/logs/access.log -c ":filter-in food"
lnav ~/logs/access.log -c ":filter-in food"  12.14s user 1.37s system 114% cpu 11.819 total

~2.6× faster end-to-end with the UI.

Hardware: AMD Ryzen 9 8945HS · 32 GB DDR5 5600 MHz · PCIe NVMe 4.0 x4

Note: lnav is a mature tool with a significantly broader feature set.


Features

  • Auto-detected log formats — JSON, syslog, journalctl, logfmt, OpenTelemetry, DLT (AUTOSAR), and more
  • Filtering — include/exclude patterns (literal or regex), date-range filters, field-scoped filters; add filters from the command line with -i/-o/-t
  • Persistent sessions — filters, scroll position, marks, and annotations survive across runs; configurable restore policy (ask / always / never)
  • Structured field view — parsed timestamps, levels, targets, and extra fields displayed in columns; select which columns you want visible
  • Vim-style navigationj/k, gg/G, Ctrl+d/u, count prefixes (5j, 10G), / search, e/w error/warning jumps
  • Annotations — attach comments to log lines; export analysis to Markdown or Jira
  • Value coloring — HTTP methods, status codes, IP addresses, and UUIDs colored automatically
  • OTel collector — receive OpenTelemetry logs in real time over gRPC or HTTP/JSON; compatible with any OTel SDK
  • Multi-tab — open multiple files, Docker streams, DLT daemon connections, or OTel collector tabs; each tab has independent filters and session state
  • MCP server — embedded Model Context Protocol server; expose marks and annotations to AI assistants
  • Headless mode — run the full filter pipeline without a TUI to preprocess huge logs
  • Fully configurable — all keybindings remappable via a config file

Installation

Pre-built binaries (recommended)

Download from the Releases page, or use the install script:

Linux / macOS

curl -fsSL https://github.com/pauloremoli/logana/releases/latest/download/logana-installer.sh | sh

Windows (PowerShell)

irm https://github.com/pauloremoli/logana/releases/latest/download/logana-installer.ps1 | iex

Homebrew (macOS / Linux)

brew tap pauloremoli/logana
brew install logana

Cargo

cargo install logana

Quick Start

# Open a file
logana app.log

# Open a directory (each file opens in its own tab)
logana /var/log/

# Pipe from stdin
journalctl -f | logana

# Start at the end and follow new lines
logana app.log --tail

# Stream a Docker container
logana            # then type :docker

# Receive OpenTelemetry logs over gRPC (port 4317)
logana            # then type :otel

# Add inline filters on the command line
logana app.log -i error -o debug
logana app.log -i "--field level=ERROR" -t "> 2024-02-21"

# Headless — filter without the TUI, output to stdout or a file
logana app.log --headless -i error -o debug
logana app.log --headless -i error --output filtered.log

Documentation

Full documentation is at pauloremoli.github.io/logana.