Skip to content

Repository files navigation

LogPilot 🪵

CIReleaseGo Report CardGo ReferenceLicense: MIT

A multi-source structured log viewer for the terminal. Tail files, pipe from Docker/kubectl, mix JSON and logfmt and plain text — all in one interactive TUI.

LogPilot demo — JSON logs

Why LogPilot?

  • Structured-first. LogPilot parses your logs — JSON fields, logfmt pairs, timestamps, levels — not just regex-highlights keywords. That means real filtering, not cosmetic coloring.
  • Format-agnostic. Auto-detects JSON, logfmt, and plain text. Tail a JSON API log and a plain syslog side by side in one view. No config files, no format declarations.
  • Interactive, not passive. Live-scrolling TUI with search, vim keybindings, and color-coded levels. Not a pager you pipe through — a tool you work in.
  • Lightweight and modern. Single binary, no runtime dependencies. Built with Go and Bubble Tea — starts instantly, stays under 20 MB RSS.

Features

Implemented

  • 🔍 Auto-format detection — JSON, logfmt, plain text, no config needed
  • 🎨 Color-coded log levels — DEBUG (gray), INFO (blue), WARN (yellow), ERROR (red), FATAL (red bold)
  • 📂 Multi-source input — files, stdin/pipes, glob patterns (*.log)
  • 🔄 Live tailing — follows files with rotation handling (rename, truncate)
  • ⏱️ Flexible timestamps — relative (2s ago), ISO 8601, local time
  • 🌗 Dark & light themes — auto-detects terminal background
  • ⌨️ Vim-style navigationj/k, G, gg, / search, n/N
  • 🚦 Backpressure handling — configurable: block or drop-oldest when buffer is full

Roadmap

  • ☸️ Kubernetes pod log source
  • 🐳 Docker container log source
  • 🔐 SSH remote log source
  • 🏷️ Field-based filtering (level:error service:auth)
  • 🔗 Trace correlation (group by trace ID)
  • 📊 Timeline visualization

Quick Start

# View a log file
logpilot app.log
# Tail with live follow
logpilot -f /var/log/app/*.log
# Pipe from Docker
docker logs -f my-container 2>&1| logpilot -
# Pipe from kubectl
kubectl logs -f deploy/api-server | logpilot -
# Mix multiple sources with glob
logpilot services/*.log /var/log/syslog

Installation

Go install (requires Go 1.22+)

go install github.com/clarabennettdev/logpilot@latest

Binary download

Grab a prebuilt binary from Releases:

# Linux (amd64)
curl -LO https://github.com/clarabennettdev/logpilot/releases/download/v0.3.0/logpilot_linux_amd64.tar.gz
tar xzf logpilot_linux_amd64.tar.gz
sudo mv logpilot /usr/local/bin/
# macOS (Apple Silicon)
curl -LO https://github.com/clarabennettdev/logpilot/releases/download/v0.3.0/logpilot_darwin_arm64.tar.gz
tar xzf logpilot_darwin_arm64.tar.gz
sudo mv logpilot /usr/local/bin/
# Windows (amd64)# Download logpilot_windows_amd64.zip from the releases page and add to PATH

From source

git clone https://github.com/clarabennettdev/logpilot.git
cd logpilot
go build -o logpilot ./cmd/logpilot

Supported Formats

LogPilot auto-detects the format of each log line independently — you can mix formats in the same stream.

JSON

{"timestamp":"2026-02-19T12:00:01Z","level":"info","msg":"request handled","method":"GET","path":"/api/users","duration_ms":42}
{"timestamp":"2026-02-19T12:00:02Z","level":"error","msg":"connection refused","host":"db-primary","port":5432}
See demoJSON log demo

logfmt

ts=2026-02-19T12:00:01Z level=info msg="request handled" method=GET path=/api/users duration_ms=42
ts=2026-02-19T12:00:02Z level=warn msg="slow query" query="SELECT *" duration_ms=1250
See demologfmt log demo

Plain text

Feb 19 12:00:01 myhost sshd[1234]: Accepted publickey for deploy
Feb 19 12:00:02 myhost nginx: 192.168.1.1 - GET /health 200
See demoPlain text log demo

Piped input

kubectl logs -f deploy/api | logpilot -
See demoPipe demo

Keybindings

KeyAction
j / Scroll down
k / Scroll up
GJump to bottom (latest)
g gJump to top
f / Page DownPage down
b / Page UpPage up
/Start search
nNext search match
NPrevious search match
tToggle timestamp format
wToggle line wrap
TabCycle theme
q / Ctrl+CQuit

Comparison

LogPilotlnavhltailspinlazyjournal
Interactive TUI
Structured parsingPartial
Multi-source
Format-agnosticPartial¹❌²
LanguageGoC++RustRustGo
FocusStructured log TUILog file navigatorLog processor/pagerHighlight & tailjournald/docker/k8s

¹ lnav supports many formats but requires format definitions for custom structured logs. ² lazyjournal focuses on journald, Docker, and Kubernetes sources rather than arbitrary log files.

Honest take: lnav is the most mature and feature-rich tool here. tailspin and hl are excellent if you want fast, zero-config highlighting for piped output. lazyjournal is great if your logs come from systemd/Docker/k8s. LogPilot occupies the space between — an interactive TUI that understands structured fields across arbitrary log sources.

Architecture

logpilot/
├── cmd/logpilot/ # CLI entrypoint
├── internal/
│ ├── app/ # Bubble Tea application model
│ ├── parser/ # Format detection + parsing (JSON, logfmt, plain)
│ ├── source/ # Input sources (file, stdin, glob)
│ ├── tail/ # File tailing with rotation handling
│ ├── theme/ # Dark/light theme definitions
│ ├── buffer/ # Ring buffer with backpressure
│ └── ui/ # Lipgloss view components
├── docs/demos/ # GIF demos
└── go.mod

Development

# Build
go build ./cmd/logpilot
# Run tests
go test ./...
# Run tests with race detector
go test -race ./...
# Benchmarks
go test -bench=. ./internal/parser/
# Lint
golangci-lint run

Contributing

Contributions are welcome! Whether it's a bug report, feature request, or pull request — all appreciated.

  1. Fork the repo
  2. Create a feature branch (git checkout -b feat/my-feature)
  3. Commit with clear messages
  4. Open a PR against main

Please open an issue first for large changes so we can discuss the approach.

Acknowledgments

Built on the shoulders of the Charm ecosystem:

License

MIT

About

🪵 A fast, multi-source structured log viewer for the terminal — stream, search, and correlate JSON, logfmt, and plain text logs with color-coded output. Built with Go and Bubble Tea.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages