diff --git a/cmd/kubectl/kubectl.go b/cmd/kubectl/kubectl.go index 09c18cfa209..4351585e684 100644 --- a/cmd/kubectl/kubectl.go +++ b/cmd/kubectl/kubectl.go @@ -17,7 +17,10 @@ limitations under the License. package main import ( + "os" + "k8s.io/component-base/cli" + "k8s.io/component-base/logs" "k8s.io/kubectl/pkg/cmd" "k8s.io/kubectl/pkg/cmd/util" @@ -26,6 +29,13 @@ import ( ) func main() { + // We need to manually parse the arguments looking for verbosity flag and + // set appropriate level here, because in the normal flow the flag parsing, + // including the logging verbosity, happens inside cli.RunNoErrOutput. + // Doing it here ensures we can continue using klog during kubectl command + // construction, which includes handling plugins and parsing .kuberc file, + // for example. + logs.GlogSetter(cmd.GetLogVerbosity(os.Args)) // nolint:errcheck command := cmd.NewDefaultKubectlCommand() if err := cli.RunNoErrOutput(command); err != nil { // Pretty-print the error and exit with an error. diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/cmd.go b/staging/src/k8s.io/kubectl/pkg/cmd/cmd.go index ed3772c5adf..ccf85a55c9a 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/cmd.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/cmd.go @@ -583,3 +583,29 @@ func registerCompletionFuncForGlobalFlags(cmd *cobra.Command, f cmdutil.Factory) return utilcomp.ListUsersInConfig(toComplete), cobra.ShellCompDirectiveNoFileComp })) } + +// GetLogVerbosity parses the provided command-line arguments to determine +// the verbosity level for logging. Returns string representing the verbosity +// level, or 0 if no verbosity flag is specified. +func GetLogVerbosity(args []string) string { + for i, arg := range args { + if arg == "--" { + // flags after "--" does not represent any flag of + // the command. We should short cut the iteration in here. + break + } + + if arg == "--v" || arg == "-v" { + if i+1 < len(args) { + return args[i+1] + } + } else if strings.Contains(arg, "--v=") || strings.Contains(arg, "-v=") { + parg := strings.Split(arg, "=") + if len(parg) > 1 && parg[1] != "" { + return parg[1] + } + } + } + + return "0" +}