Stern is a command-line tool designed to simplify log tailing across multiple pods and containers in Kubernetes. It enables users to monitor logs from various components simultaneously, making debugging and monitoring more efficient.
Key Features:
Multi-pod and Container Support: Tail logs from multiple pods and their respective containers in a single session.
Color-Coded Output: Logs are color-coded based on pod and container names for easier identification and quicker debugging.
Regex or Resource-Based Queries: Use regular expressions or Kubernetes resources (e.g., deployments, services) to filter logs, eliminating the need to specify exact pod IDs.
Dynamic Pod Management: Automatically adds new pods as they appear and removes deleted ones without manual intervention.
Container-Specific Filtering: Tail logs from specific containers within a pod using flags, allowing targeted monitoring.
Audience & Benefit:
Ideal for Kubernetes administrators and developers who need efficient debugging in complex environments. Stern helps save time by providing a unified view of logs across multiple components, reducing the likelihood of missing critical information during troubleshooting or monitoring.
Stern can be installed via winget on Windows, making it accessible to users familiar with package managers.
Stern allows you to tail multiple pods on Kubernetes and multiple containers
within the pod. Each result is color coded for quicker debugging.
The query is a regular expression or a Kubernetes resource in the form
/ so the pod name can easily be filtered and
you don't need to specify the exact id (for instance omitting the deployment
id). If a pod is deleted it gets removed from tail and if a new pod is added it
automatically gets tailed.
When a pod contains multiple containers Stern can tail all of them too without
having to do this manually for each one. Simply specify the container flag to
limit what containers to show. By default all containers are listened to.
If you use Krew which is the package manager for kubectl plugins, you can install like this:
kubectl krew install stern
WinGet (Windows)
If you're running on Windows, usually the actual best way is to use WinGet to install which is Windows' built-in package manager, you can install like this:
winget install stern.stern
Usage
stern pod-query [flags]
The pod-query is a regular expression or a Kubernetes resource in the form /.
The query is a regular expression when it is not a Kubernetes resource,
so you could provide "web-\w" to tail web-backend and web-frontend pods but not web-123.
When the query is in the form (exact match), you can select all pods belonging
to the specified Kubernetes resource, such as .
Supported Kubernetes resources are , , , , ,
, and .
If present, tail across all namespaces. A specific namespace is ignored even if specified with --namespace.
--color
auto
Force set color output. 'auto': colorize if tty attached, 'always': always colorize, 'never': never colorize.
--completion
Output stern command-line completion code for the specified shell. Can be 'bash', 'zsh' or 'fish'.
--condition
The condition to filter on: [condition-name[=condition-value]. The default condition-value is true. Match is case-insensitive. Currently only supported with --tail=0 or --no-follow.
--config
~/.config/stern/config.yaml
Path to the stern config file
--container, -c
.*
Container name when multiple containers in pod. (regular expression)
--container-colors
Specifies the colors used to highlight container names. Use the same format as --pod-colors. Defaults to the values of --pod-colors if omitted, and must match its length.
--container-state
all
Tail containers with state in running, waiting, terminated, or all. 'all' matches all container states. To specify multiple states, repeat this or set comma-separated value.
--context
The name of the kubeconfig context to use
--diff-container, -d
false
Display different colors for different containers.
--ephemeral-containers
true
Include or exclude ephemeral containers.
--exclude, -e
[]
Log lines to exclude. (regular expression)
--exclude-container, -E
[]
Container name to exclude when multiple containers in pod. (regular expression)
--exclude-pod
[]
Pod name to exclude. (regular expression)
--field-selector
Selector (field query) to filter on. If present, default to ".*" for the pod-query.
--highlight, -H
[]
Log lines to highlight. (regular expression)
--include, -i
[]
Log lines to include. (regular expression)
--init-containers
true
Include or exclude init containers.
--kubeconfig
Path to the kubeconfig file to use for CLI requests.
--max-log-requests
-1
Maximum number of concurrent logs to request. Defaults to 50, but 5 when specifying --no-follow
--namespace, -n
Kubernetes namespace to use. Default to namespace configured in kubernetes context. To specify multiple namespaces, repeat this or set comma-separated value.
--no-follow
false
Exit when all logs have been shown.
--node
Node name to filter on.
--only-log-lines
false
Print only log lines
--output, -o
default
Specify predefined template. Currently support: [default, raw, json, extjson, ppextjson]
--pod-colors
Specifies the colors used to highlight pod names. Provide colors as a comma-separated list using SGR (Select Graphic Rendition) sequences, e.g., "91,92,93,94,95,96".
--prompt, -p
false
Toggle interactive prompt for selecting 'app.kubernetes.io/instance' label values.
--selector, -l
Selector (label query) to filter on. If present, default to ".*" for the pod-query.
--show-hidden-options
false
Print a list of hidden options.
--since, -s
48h0m0s
Return logs newer than a relative duration like 5s, 2m, or 3h.
--stdin
false
Parse logs from stdin. All Kubernetes related flags are ignored when it is set.
--tail
-1
The number of lines from the end of the logs to show. Defaults to -1, showing all logs.
--template
Template to use for log lines, leave empty to use --output flag.
--template-file, -T
Path to template to use for log lines, leave empty to use --output flag. It overrides --template option.
--timestamps, -t
Print timestamps with the specified format. One of 'default' or 'short' in the form '--timestamps=format' ('=' cannot be omitted). If specified but without value, 'default' is used.
--timezone
Local
Set timestamps to specific timezone.
--verbosity
0
Number of the log level verbosity
--version, -v
false
Print the version and exit.
See stern --help for details
Stern will use the $KUBECONFIG environment variable if set. If both the
environment variable and --kubeconfig flag are passed the cli flag will be
used.
config file
You can use the config file to change the default values of stern options. The default config file path is ~/.config/stern/config.yaml.
# :
tail: 10
max-log-requests: 999
timestamps: short
You can change the config file path with --config flag or STERNCONFIG environment variable.
templates
stern supports outputting custom log messages. There are a few predefined
templates which you can use by specifying the --output flag:
output
description
default
Displays the namespace, pod and container, and decorates it with color depending on --color
raw
Only outputs the log message itself, useful when your logs are json and you want to pipe them to jq
json
Marshals the log struct to json. Useful for programmatic purposes
extjson
Outputs extended JSON with colorized pod/container names
ppextjson
Pretty-prints extended JSON with colorized pod/container names
It accepts a custom template through the --template flag, which will be
compiled to a Go template and then used for every log message. This Go template
will receive the following struct:
property
type
description
Message
string
The log message itself
NodeName
string
The node name where the pod is scheduled on
Namespace
string
The namespace of the pod
PodName
string
The name of the pod
ContainerName
string
The name of the container
Labels
map[string]string
The labels of the pod
Annotations
map[string]string
The annotations of the pod
The following functions are available within the template (besides the builtin
functions):
func
arguments
description
json
object
Marshal the object and output it as a json text
color
color.Color, string
Wrap the text in color (.ContainerColor and .PodColor provided)
parseJSON
string
Parse string as JSON
tryParseJSON
string
Attempt to parse string as JSON, return nil on failure
extractJSONParts
string, ...string
Parse string as JSON and concatenate the given keys.
tryExtractJSONParts
string, ...string
Attempt to parse string as JSON and concatenate the given keys. , return text on failure
prettyJSON
any
Parse input and emit it as pretty printed JSON, if parse fails output string as is.
toRFC3339Nano
object
Parse timestamp (string, int, json.Number) and output it using RFC3339Nano format
toTimestamp
object, string [, string]
Parse timestamp (string, int, json.Number) and output it using the given layout in the timezone that is optionally given (defaults to UTC).
levelColor
string
Print log level using appropriate color
bunyanLevelColor
string
Print bunyan numeric log level using appropriate color
colorBlack
string
Print text using black color
colorRed
string
Print text using red color
colorGreen
string
Print text using green color
colorYellow
string
Print text using yellow color
colorBlue
string
Print text using blue color
colorMagenta
string
Print text using magenta color
colorCyan
string
Print text using cyan color
colorWhite
string
Print text using white color
colorCustom
string, int [, int]
Print text using custom color, i.e. {{color "Hi" 3 96}} will print "Hi" as italic with cyan color
Log level verbosity
You can configure the log level verbosity by the --verbosity flag.
It is useful when you want to know how stern interacts with a Kubernetes API server in troubleshooting.
Increasing the verbosity increases the number of logs. --verbosity 6 would be a good starting point.
Max log requests
Stern has the maximum number of concurrent logs to request to prevent unintentional load to a cluster.
The number can be configured by the --max-log-requests flag.
The behavior and the default are different depending on the presence of the --no-follow flag.
--no-follow
default
behavior
specified
5
limits the number of concurrent logs to request
not specified
50
exits with an error when if it reaches the concurrent limit
The combination of --max-log-requests 1 and --no-follow will be helpful if you want to show logs in order.
Customize highlight colors
You can configure highlight colors for pods and containers in the config file using a comma-separated list of SGR (Select Graphic Rendition) sequences, as shown below. If you omit container-colors, the pod colors will be used as container colors as well.
# Green, Yellow, Blue, Magenta, Cyan, White
pod-colors: "32,33,34,35,36,37"
# Colors with underline (4)
# If empty, the pod colors will be used as container colors
container-colors: "32;4,33;4,34;4,35;4,36;4,37;4"
This format enables the use of various attributes, such as underline, background colors, 8-bit colors, and 24-bit colors, if your terminal supports them.
The equivalent flags --pod-colors and --container-colors are also available. The following command applies 24-bit colors using the --pod-colors flag.
# Will try to parse .Message as JSON and pretty print it, if not json will output as is
stern --template='{{ .Message | prettyJSON }}{{"\n"}}' backend
# Or with parsed json, will drop non-json logs because of `with`
stern --template='{{ with $msg := .Message | tryParseJSON }}{{ prettyJSON $msg }}{{"\n"}}{{end}}' backend
Load custom template from file:
stern --template-file=~/.stern.tpl backend
Trigger the interactive prompt to select an 'app.kubernetes.io/instance' label value:
stern -p
Output log lines only:
stern . --only-log-lines
Read from stdin:
stern --stdin < service.log
Only display logs for pods that are not ready:
stern . --condition=ready=false --tail=0
Completion
Stern supports command-line auto completion for bash, zsh or fish. stern --completion=(bash|zsh|fish) outputs the shell completion code which work by being
evaluated in .bashrc, etc for the specified shell. In addition, Stern
supports dynamic completion for --namespace, --context, --node, a resource query
in the form /, and flags with pre-defined choices.
If you use bash, stern bash completion code depends on the
bash-completion. On the macOS, you
can install it with homebrew as follows:
# If running Bash 3.2
brew install bash-completion
# or, if running Bash 4.1+
brew install bash-completion@2
Note that bash-completion must be sourced before sourcing the stern bash
completion code in .bashrc.