diff --git a/cmd/info.go b/cmd/info.go index b82fe3f4..e7a7210c 100644 --- a/cmd/info.go +++ b/cmd/info.go @@ -25,7 +25,7 @@ func printInfo() { printLogo(color.Cyan) printTuple(fmat, "Configuration", config.K9sConfigFile, color.Cyan) - printTuple(fmat, "Logs", config.K9sLogs, color.Cyan) + printTuple(fmat, "Logs", config.DefaultLogFile, color.Cyan) printTuple(fmat, "Screen Dumps", config.K9sDumpDir, color.Cyan) } diff --git a/cmd/root.go b/cmd/root.go index d3eb5857..430bdda1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "os" "runtime/debug" "github.com/derailed/k9s/internal/client" @@ -62,6 +63,17 @@ func run(cmd *cobra.Command, args []string) { } }() + config.EnsurePath(*k9sFlags.LogFile, config.DefaultDirMod) + mod := os.O_CREATE | os.O_APPEND | os.O_WRONLY + file, err := os.OpenFile(*k9sFlags.LogFile, mod, config.DefaultFileMod) + defer func() { + _ = file.Close() + }() + if err != nil { + panic(err) + } + log.Logger = log.Output(zerolog.ConsoleWriter{Out: file}) + zerolog.SetGlobalLevel(parseLevel(*k9sFlags.LogLevel)) app := view.NewApp(loadConfiguration()) if err := app.Init(version, *k9sFlags.RefreshRate); err != nil { @@ -150,6 +162,12 @@ func initK9sFlags() { config.DefaultLogLevel, "Specify a log level (info, warn, debug, error, fatal, panic, trace)", ) + rootCmd.Flags().StringVarP( + k9sFlags.LogFile, + "logFile", "", + config.DefaultLogFile, + "Specify the log file", + ) rootCmd.Flags().BoolVar( k9sFlags.Headless, "headless", diff --git a/internal/config/config.go b/internal/config/config.go index f4b04a26..33c8d5d3 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,8 +20,6 @@ const K9sConfig = "K9SCONFIG" var ( // K9sConfigFile represents K9s config file location. K9sConfigFile = filepath.Join(K9sHome(), "config.yml") - // K9sLogs represents K9s log. - K9sLogs = filepath.Join(os.TempDir(), fmt.Sprintf("k9s-%s.log", MustK9sUser())) // K9sDumpDir represents a directory where K9s screen dumps will be persisted. K9sDumpDir = filepath.Join(os.TempDir(), fmt.Sprintf("k9s-screens-%s", MustK9sUser())) ) diff --git a/internal/config/flags.go b/internal/config/flags.go index 6fb05bc8..363752e0 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -1,5 +1,11 @@ package config +import ( + "fmt" + "os" + "path/filepath" +) + const ( // DefaultRefreshRate represents the refresh interval. DefaultRefreshRate = 2 // secs @@ -11,10 +17,14 @@ const ( DefaultCommand = "" ) +// DefaultLogFile represents the default K9s log file. +var DefaultLogFile = filepath.Join(os.TempDir(), fmt.Sprintf("k9s-%s.log", MustK9sUser())) + // Flags represents K9s configuration flags. type Flags struct { RefreshRate *int LogLevel *string + LogFile *string Headless *bool Logoless *bool Command *string @@ -29,6 +39,7 @@ func NewFlags() *Flags { return &Flags{ RefreshRate: intPtr(DefaultRefreshRate), LogLevel: strPtr(DefaultLogLevel), + LogFile: strPtr(DefaultLogFile), Headless: boolPtr(false), Logoless: boolPtr(false), Command: strPtr(DefaultCommand), diff --git a/main.go b/main.go index 9da315f8..dd4d99ad 100644 --- a/main.go +++ b/main.go @@ -2,20 +2,12 @@ package main import ( "flag" - "os" "github.com/derailed/k9s/cmd" - "github.com/derailed/k9s/internal/config" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/klog/v2" ) -func init() { - config.EnsurePath(config.K9sLogs, config.DefaultDirMod) -} - func init() { klog.InitFlags(nil) @@ -31,21 +23,8 @@ func init() { if err := flag.Set("v", "0"); err != nil { panic(err) } - if err := flag.Set("log_file", config.K9sLogs); err != nil { - panic(err) - } } func main() { - mod := os.O_CREATE | os.O_APPEND | os.O_WRONLY - file, err := os.OpenFile(config.K9sLogs, mod, config.DefaultFileMod) - defer func() { - _ = file.Close() - }() - if err != nil { - panic(err) - } - log.Logger = log.Output(zerolog.ConsoleWriter{Out: file}) - cmd.Execute() }