An interactive Kubernetes log viewer for your terminal.
- View logs across multiple containers, pods, namespaces, and clusters
- Select containers interactively or auto-select by pattern matching against names, labels, and more
- See cluster changes in real time
- Navigate interleaved logs from multiple containers, ordered globally by timestamp
- Search logs by exact string or regex pattern. Include surrounding context or show matching lines only
- Zoom in and flip through single formatted logs one by one
- Archive and share: save logs to a local file or copy a log to your clipboard
- Use your own terminal color scheme
Comparable to:
- k9s but focused on logs
- kubectl logs supercharged
- stern & kail but multi-cluster and an interactive interface
Install and run kl
in a terminal. See kl --help
for all options.
Press ?
in any view to see keyboard shortcuts specific to the current view and across the application.
Examples:
# Use the current kubernetes context. If context namespace doesn't exist, uses `default`
kl
# Use context `my-context`, all namespaces
kl --context my-context -A
# Use contexts `my-context` & `other-context`, namespaces `default` & `other-ns` in each
kl --context my-context,other-context -n default,other-ns
# Auto-select all containers in a with a pod owner (e.g. deployment) containing the word `nginx`
kl --mown nginx
# Auto-select all containers with the exact name of `my-container`, limited to 10 selections
kl --mc "^my-container$" --limit 10
# Auto-select all containers that have labels app=flask and either tier=stage or tier=prod
kl -l 'app=flask,tier in (stage, prod)'
# Ignore all containers with the exact name of `my-sidecar`
kl --ic "^my-sidecar$"
# Start on the logs page, ordered by timestamp descending, showing logs from 10 minutes ago onwards
kl --mc "^my-container$" -d --logs-view --since 10m
The following installation options are available:
# homebrew
brew install robinovitch61/tap/kl
# upgrade using homebrew
brew update && brew upgrade kl
# nix-shell
# ensure NUR is accessible (https://github.com/nix-community/NUR)
nix-shell -p nur.repos.robinovitch61.kl
# nix flakes
# ensure flake support is enabled (https://nixos.wiki/wiki/Flakes#Enable_flakes_temporarily)
nix run github:robinovitch61/nur-packages#kl
# arch linux
# PKGBUILD available at https://aur.archlinux.org/packages/kl-bin
yay -S kl-bin
# with go (https://go.dev/doc/install)
go install github.com/robinovitch61/kl@latest
# windows with winget
winget install robinovitch61.kl
# windows with scoop
scoop bucket add robinovitch61 https://github.com/robinovitch61/scoop-bucket
scoop install kl
# windows with chocolatey
choco install kl
You can also download prebuilt releases and move the unpacked
binary to somewhere in your PATH
.
kl
is written with tools from Charm.
Feature requests and bug reports are welcome.
To manually build the project:
git clone [email protected]:robinovitch61/kl.git
cd kl
go build # outputs ./kl executable
Running a an example flask + postgres + nginx setup in a local k3d cluster for testing locally:
k3d cluster create test
k3d cluster create test2
kubectl --context k3d-test apply -f ./dev/deploy.yaml
kubectl --context k3d-test2 create namespace otherns
kubectl --context k3d-test2 apply -f ./dev/deploy.yaml -n otherns
# view both clusters and all namespaces in kl
kl --context k3d-test,k3d-test2 -A
# access the application's webpage
kubectl --context k3d-test2 -n otherns port-forward services/frontend-service 8080:80
open http://localhost:8080
# browser console one-liner to click button every second to generate logs
setInterval(() => { document.getElementsByTagName("button")[0].click();}, 1000);
# or make requests directly to flask from the terminal
kubectl --context k3d-test2 port-forward services/flask-service 5000:5000
curl http://localhost:5000/status
If necessary, you can manually specify the output of kl --version
at build time as follows:
go build -ldflags "-X github.com/robinovitch61/kl/cmd.Version=vX.Y.Z"
In this case, you're responsible for ensuring the specified version matches what is being built.