Home

Awesome

kl

<p> <a href="https://github.com/robinovitch61/kl/releases"><img src="https://shields.io/github/v/release/robinovitch61/kl.svg" alt="Latest Release"></a> <a href="https://pkg.go.dev/github.com/robinovitch61/kl?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="GoDoc"></a> <a href="https://github.com/robinovitch61/kl/actions"><img src="https://github.com/robinovitch61/kl/workflows/build/badge.svg" alt="Build Status"></a> </p>

An interactive Kubernetes log viewer for your terminal.

<img src="./demo/demo.gif" alt="gif demo of kl"/>

Comparable to:

Usage

Install and run kl in a terminal. See kl --help for all options.

Examples:

# Use the current kubernetes context, defaulting to `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 context
kl --context my-context,other-context -n default,other-ns

# Auto-select containers with a pod owner (e.g. deployment) containing the word `nginx`
kl --mown nginx

# Auto-select containers with the exact name `my-container`, limited to 10 containers
kl --mc "^my-container$" --limit 10

# Auto-select containers that have labels app=flask and either tier=stage or tier=prod
kl -l 'app=flask,tier in (stage, prod)'

# Ignore containers with the exact name of `my-sidecar`
kl --ic "^my-sidecar$"

# Start focused on logs, ordered by timestamp descending, showing logs from 10 minutes ago onwards
kl --mc "^my-container$" -d --logs-view --since 10m

Press ? in any view to see keyboard shortcuts specific to the current view and across the application.

KeyAction
↓/jdown one line
↑/kup one line
ddown half page
uup half page
fdown full page
bup full page
ggo to top (will follow logs if descending)
Ggo to bottom (will follow logs if ascending)
lfocus on logs view
Lfocus on logs view in fullscreen
enterzoom in to single log view for selected log
escback to all logs view when viewing single log
sfocus on container selection view
Sfocus on container selection view in fullscreen
Ftoggle fullscreen
/edit exact match filter
redit regex filter
enterwhen filtering, apply filter
escdiscard applied filter
nnext filter match
Nprevious filter match
xtoggle showing only the logs matching filter
wtoggle line wrap
←/→/h/lpan left/right when not wrapped
oreverse timestamp ordering
ppause/resume log stream
tchange timestamp format
cchange container name format
0-9change time from which logs begin
ctrl+ssave focused view to local file
ctrl+yin single log view, copy to clipboard
?show/hide help

Installation

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.

Development

kl is written with tools from Charm.

Feature requests and bug reports are welcome.

Running the app with the environment variable KL_DEBUG=1 will create or append to a kl.log file in your current directory with debug logs.

To manually build the project:

git clone git@github.com:robinovitch61/kl.git
cd kl
go build  # outputs ./kl executable

Run 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

Manually Specify the kl Version at Build Time

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.