diff --git a/contrib/completions/bash/kubectl b/contrib/completions/bash/kubectl index 1ca375f6bf7..6cc57a27fbd 100644 --- a/contrib/completions/bash/kubectl +++ b/contrib/completions/bash/kubectl @@ -428,6 +428,8 @@ _kubectl_logs() flags_with_completion=() flags_completion=() + flags+=("--container=") + two_word_flags+=("-c") flags+=("--follow") flags+=("-f") flags+=("--help") diff --git a/docs/kubectl_logs.md b/docs/kubectl_logs.md index 669e08c3a0b..32516d53e50 100644 --- a/docs/kubectl_logs.md +++ b/docs/kubectl_logs.md @@ -8,7 +8,7 @@ Print the logs for a container in a pod. Print the logs for a container in a pod. If the pod has only one container, the container name is optional. ``` -kubectl logs [-f] [-p] POD [CONTAINER] +kubectl logs [-f] [-p] POD [-c CONTAINER] ``` ### Examples @@ -27,6 +27,7 @@ $ kubectl logs -f 123456-7890 ruby-container ### Options ``` + -c, --container="": Container name -f, --follow=false: Specify if the logs should be streamed. -h, --help=false: help for logs --interactive=true: If true, prompt the user for input when required. Default true. @@ -65,6 +66,6 @@ $ kubectl logs -f 123456-7890 ruby-container ### SEE ALSO * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra at 2015-05-21 20:24:03.06578685 +0000 UTC +###### Auto generated by spf13/cobra at 2015-06-30 16:27:32.981507725 +0000 UTC [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/kubectl_logs.md?pixel)]() diff --git a/docs/man/man1/kubectl-logs.1 b/docs/man/man1/kubectl-logs.1 index 148efd87678..657afc01273 100644 --- a/docs/man/man1/kubectl-logs.1 +++ b/docs/man/man1/kubectl-logs.1 @@ -17,6 +17,10 @@ Print the logs for a container in a pod. If the pod has only one container, the .SH OPTIONS +.PP +\fB\-c\fP, \fB\-\-container\fP="" + Container name + .PP \fB\-f\fP, \fB\-\-follow\fP=false Specify if the logs should be streamed. diff --git a/pkg/kubectl/cmd/log.go b/pkg/kubectl/cmd/log.go index 281f44c44fe..ad7b84a0ad8 100644 --- a/pkg/kubectl/cmd/log.go +++ b/pkg/kubectl/cmd/log.go @@ -61,15 +61,20 @@ func selectContainer(pod *api.Pod, in io.Reader, out io.Writer) string { } } +type logParams struct { + containerName string +} + // NewCmdLog creates a new pod log command func NewCmdLog(f *cmdutil.Factory, out io.Writer) *cobra.Command { + params := &logParams{} cmd := &cobra.Command{ - Use: "logs [-f] [-p] POD [CONTAINER]", + Use: "logs [-f] [-p] POD [-c CONTAINER]", Short: "Print the logs for a container in a pod.", Long: "Print the logs for a container in a pod. If the pod has only one container, the container name is optional.", Example: log_example, Run: func(cmd *cobra.Command, args []string) { - err := RunLog(f, out, cmd, args) + err := RunLog(f, out, cmd, args, params) cmdutil.CheckErr(err) }, Aliases: []string{"log"}, @@ -77,11 +82,12 @@ func NewCmdLog(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().BoolP("follow", "f", false, "Specify if the logs should be streamed.") cmd.Flags().Bool("interactive", true, "If true, prompt the user for input when required. Default true.") cmd.Flags().BoolP("previous", "p", false, "If true, print the logs for the previous instance of the container in a pod if it exists.") + cmd.Flags().StringVarP(¶ms.containerName, "container", "c", "", "Container name") return cmd } // RunLog retrieves a pod log -func RunLog(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error { +func RunLog(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, p *logParams) error { if len(os.Args) > 1 && os.Args[1] == "log" { printDeprecationWarning("logs", "log") } @@ -111,13 +117,19 @@ func RunLog(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string } var container string - if len(args) == 1 { - if len(pod.Spec.Containers) != 1 { - return fmt.Errorf("POD %s has more than one container; please specify the container to print logs for", pod.ObjectMeta.Name) - } - container = pod.Spec.Containers[0].Name + if cmdutil.GetFlagString(cmd, "container") != "" { + // [-c CONTAINER] + container = p.containerName } else { - container = args[1] + // [CONTAINER] (container as arg not flag) is supported as legacy behavior. See PR #10519 for more details. + if len(args) == 1 { + if len(pod.Spec.Containers) != 1 { + return fmt.Errorf("POD %s has more than one container; please specify the container to print logs for", pod.ObjectMeta.Name) + } + container = pod.Spec.Containers[0].Name + } else { + container = args[1] + } } follow := false