Install
One-liner (Linux / macOS):
|
Update to the latest version — the same command:
|
Cargo (from source):
# Update
Manual download: grab a binary from Releases.
| Platform | Binary |
|---|---|
| Linux x86_64 | logpulse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz |
| Linux ARM64 | logpulse-vX.X.X-aarch64-unknown-linux-gnu.tar.gz |
| macOS x86_64 | logpulse-vX.X.X-x86_64-apple-darwin.tar.gz |
| macOS ARM64 (Apple Silicon) | logpulse-vX.X.X-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | logpulse-vX.X.X-x86_64-pc-windows-msvc.zip |
Shell completions:
# Bash
# Zsh
# Fish
Quick Start
# Local log file
# Multiple files at once
# Force a specific parser
# Pipe from Docker (auto-detects stdin)
|
Remote Sources
Docker (smart prefix match + auto-reconnect)
# Container stdout — matches myapi.1.abc123 in Swarm
# Log file inside container
Finds containers by name prefix (docker ps --filter name=<prefix>). Works with Docker Swarm and Compose — no manager access needed. Auto-reconnects when a container restarts or redeploys (tries for 5 minutes).
SSH (remote files & remote Docker)
# Remote log file
# Remote Docker container (same smart matching)
# Log file inside remote container
Proxy / bastion / jump host — pass directly, no config needed:
# Via jump host (corporate proxy, bastion)
# Custom port + key
# All together
Also respects ~/.ssh/config for keys, ports, ProxyJump, ProxyCommand — use whichever is more convenient.
Kubernetes
# Pod stdout
# Specific namespace
# Specific container in multi-container pod
# Find pod by label
# Log file inside pod
Docker Compose
# Service logs
# Custom compose file
Features
- Smart format detection — auto-detects JSON, Laravel, Django, Go, Nginx from first lines
- Multiline grouping — stack traces (PHP, Java, Python) auto-grouped with parent error, shown as
[+N lines] - Regex search (
?) — highlights matches inline, navigate withn/N(wraps around) - Pattern highlighting (
*) — up to 4 colors (Magenta, Cyan, Yellow, Red), stack multiple patterns - Copy to clipboard (
y) — copies selected entry + stack trace to system clipboard - Export to file (
s) — save all visible (filtered) entries to a file - Time jump (
g) — type14:30to jump to that timestamp, auto-pauses - Pause mode — freezes display without losing incoming data (buffered in channel)
- Lazy history — for local files, scrolling up loads older lines on demand
Hotkeys
| Key | Action |
|---|---|
q |
Quit |
Space |
Pause / Resume (freeze mode — data is buffered, not lost) |
/ |
Filter — regex, Enter to apply, Esc to cancel |
? |
Search — highlights matches, Enter to apply |
n / N |
Next / Previous search match |
e |
Toggle error-only mode |
* |
Highlight pattern (empty = clear all) |
y |
Copy selected entry to clipboard |
s |
Save visible entries to file |
g |
Jump to time (e.g. 14:30, 2024-01-15) |
Enter |
Detail view (JSON pretty-print / stacktrace) |
c |
Clear screen buffer |
j / k or Up / Down |
Navigate log lines |
PgDn / PgUp |
Jump 50 lines |
Home / End |
Jump to first / last entry |
Left / Right |
Horizontal scroll |
Esc |
Close detail view / cancel input |
Ctrl+C |
Force quit |
Supported Formats
LogPulse auto-detects the log format from the first lines. No configuration needed.
Use --format to override: logpulse --format nginx access.log
| Format | Flag | Example |
|---|---|---|
| JSON | --format json |
{"level":"error","msg":"failed","service":"api"} |
| Laravel | --format laravel |
[2024-01-15 10:30:01] production.ERROR: Connection refused |
| Django | --format django |
[15/Jan/2024 10:30:11] ERROR [django.request] Internal Server Error |
| Go (slog) | --format go |
time=2024-01-15T10:30:09Z level=ERROR msg="panic recovered" |
| Nginx/Apache | --format nginx |
192.168.1.1 - - [15/Jan/2024:10:30:07] "GET /api" 500 89 |
| Plain text | --format plain |
Anything else — level detected by keywords |
How It Works
┌─ LogPulse ──────────────────────────┬─ Activity ─────────────────┐
│ app.log | EPS: 42 | Errors: 3 │ ▁▂▃▅▇▅▃▂▁▂▃▅▇█▇▅▃▂▁ │
├─ Log Feed ──────────────────────────┴────────────────────────────┤
│ [ERROR] Connection refused to database │
│ [INFO] Request processed successfully │
│ [WARN] Slow query detected (2.5s) │
│ [DEBUG] Cache hit for key=user:123 │
│ [ERROR] Undefined variable: $user [+12 lines]│
├─ Help ──────────────────────────────────────────────────────────┤
│ q:quit Space:pause /:filter ?:search e:errors y:copy *:mark s:save│
└─────────────────────────────────────────────────────────────────┘
Requirements
- Local / stdin mode: just the binary
- Docker mode:
dockerCLI available and running - SSH mode:
sshCLI with key-based auth configured - Kubernetes mode:
kubectlwith cluster access configured - Compose mode:
docker compose(v2) available
Binary is ~2.7 MB, statically optimized. No runtime dependencies.
Building from Source
# Binary at ./target/release/logpulse
Contributing
See CONTRIBUTING.md for guidelines.