CLI for analyzing video SDK / WebRTC call logs. Reads CSV / JSONL / TXT exports, surfaces call-quality issues, and renders a per-participant report with side-by-side timeline and crossover detection.
Early-phase tool — findings may be inaccurate. Always verify against the source dashboard.
git clone https://github.com/manish10mks/log-analyzer
cd log-analyzer
./install.shInstalls to ~/.local/bin, detects your shell (zsh / bash / fish), and adds the directory to $PATH in the right rc file — creating it if missing. Re-run to upgrade; the previous binary is backed up to <path>.bak.
Overrides: INSTALL_DIR=<path>, NO_BACKUP=1, SKIP_PATH=1. Requires Go 1.21+ (tested with go1.26.1 darwin/arm64).
Runs fully offline — analysis makes no network calls. Only ./install.sh (or go build) needs internet, once, to fetch Go module dependencies.
log-analyzer analyze <file> [file ...] [flags]
| Flag | Default | Description |
|---|---|---|
-f, --format |
auto |
Force format: auto / json / csv / txt |
-s, --severity |
INFO |
Minimum severity: INFO / WARNING / CRITICAL |
-o, --output |
terminal |
Output: terminal / json |
--session-id |
Filter to one session ID | |
--no-color |
Disable ANSI colors | |
-v, --verbose |
Show all log entries alongside issues |
# Single CSV export
log-analyzer analyze export.csv
# Two participants merged into one timeline + crossover report
log-analyzer analyze "export.csv" "export (1).csv"
# Only critical issues
log-analyzer analyze export.csv --severity CRITICAL
# JSON for piping
log-analyzer analyze export.csv --output json | jq .~25 rules, severity-tagged, grouped by category:
- Connection failures — ICE / DTLS / signaling drops, room-lookup failures, frequent reconnects, slow joins, websocket errors
- Network degradation — sustained packet loss, jitter spikes, RTT spikes, bitrate drops, low target bitrate
- Path & device changes — wifi↔cellular handover, audio/camera switches, Bluetooth detection, TURN-relay fallback
- Permission & hardware errors — denied mic/camera permission, device-busy / not-found, track errors
- Cross-participant — asymmetric failures (problem was one-sided), early-leave during peer degradation
- Known browser/SDK quirks — iOS cellular bitrate throttle, Chrome-on-Windows + Bluetooth AEC, Safari sticky permission denial, Edge H.264 hardware accel, React Native Android audio routing
Each issue carries session_id, severity, UTC timestamp, and a short description.
CSV (video SDK dashboard exports, including BOM-prefixed Excel exports), JSONL, and plain text (React Native console output). Format is auto-detected. Pass multiple files in one run — entries are merged by session ID, useful when each participant exported their own log.
From your video SDK dashboard, open the call's Logs view, select a date range, and Export — most providers emit one CSV per participant. Then run:
log-analyzer analyze export.csv "export (1).csv" ...══════════════════════════════════════════════════════════════
Started: 2026-04-21 10:29:49 UTC │ Duration: 35m 14s
PARTICIPANTS
Participant A React Native 0.81.6 · iOS 26.2.1
Network: Cellular ⚠ switched mid-call
Participant B Chrome 147.0.0.0 · macOS 26.3.1
Network: Wifi
TIMELINE (side-by-side view of joins, leaves, and issues)
Time Participant A Participant B
+0:30 ✗ signaling-failure
+3:11 ⚠ network-quality-repeated-warning
+3:14 ⚠ network-quality-repeated-warning
CROSSOVERS (issues within 30s across participants — likely shared cause)
+3:11 → +3:14 (3s span)
Participant A ⚠ network-quality-repeated-warning
Participant B ⚠ network-quality-repeated-warning
A linear pipeline: parse → group entries by session → run rules → render report. Parsers auto-detect format from the first 512 bytes ({ → JSONL, comma-heavy header → CSV, else TXT) and map each line into a normalized LogEntry. To add a rule, write func ruleX(s *Session) []Issue and append it to AllRules in internal/analyzer/rules.go — every issue is auto-tagged with session_id, severity, and timestamp by the analyzer.
go test ./...
go build -o log-analyzer .MIT © MKS
Built with Claude Code.