LogPilot πͺ΅

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.
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 navigation β
j/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
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 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 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 demo
kubectl logs -f deploy/api | logpilot -
See demo
Keybindings
| Key |
Action |
j / β |
Scroll down |
k / β |
Scroll up |
G |
Jump to bottom (latest) |
g g |
Jump to top |
f / Page Down |
Page down |
b / Page Up |
Page up |
/ |
Start search |
n |
Next search match |
N |
Previous search match |
t |
Toggle timestamp format |
w |
Toggle line wrap |
Tab |
Cycle theme |
q / Ctrl+C |
Quit |
Comparison
|
LogPilot |
lnav |
hl |
tailspin |
lazyjournal |
| Interactive TUI |
β
|
β
|
β |
β |
β
|
| Structured parsing |
β
|
β
|
β |
β |
Partial |
| Multi-source |
β
|
β
|
β
|
β
|
β
|
| Format-agnostic |
β
|
PartialΒΉ |
β
|
β
|
βΒ² |
| Language |
Go |
C++ |
Rust |
Rust |
Go |
| Focus |
Structured log TUI |
Log file navigator |
Log processor/pager |
Highlight & tail |
journald/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.
- Fork the repo
- Create a feature branch (
git checkout -b feat/my-feature)
- Commit with clear messages
- 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