diff options
Diffstat (limited to 'client/go/cmd/log.go')
-rw-r--r-- | client/go/cmd/log.go | 114 |
1 files changed, 56 insertions, 58 deletions
diff --git a/client/go/cmd/log.go b/client/go/cmd/log.go index d61eaecf35b..829f2c4c1f1 100644 --- a/client/go/cmd/log.go +++ b/client/go/cmd/log.go @@ -9,72 +9,70 @@ import ( "github.com/vespa-engine/vespa/client/go/vespa" ) -var ( - fromArg string - toArg string - levelArg string - followArg bool - dequoteArg bool -) - -func init() { - rootCmd.AddCommand(logCmd) - logCmd.Flags().StringVarP(&fromArg, "from", "F", "", "Include logs since this timestamp (RFC3339 format)") - logCmd.Flags().StringVarP(&toArg, "to", "T", "", "Include logs until this timestamp (RFC3339 format)") - logCmd.Flags().StringVarP(&levelArg, "level", "l", "debug", `The maximum log level to show. Must be "error", "warning", "info" or "debug"`) - logCmd.Flags().BoolVarP(&followArg, "follow", "f", false, "Follow logs") - logCmd.Flags().BoolVarP(&dequoteArg, "nldequote", "n", true, "Dequote LF and TAB characters in log messages") -} - -var logCmd = &cobra.Command{ - Use: "log [relative-period]", - Short: "Show the Vespa log", - Long: `Show the Vespa log. +func newLogCmd(cli *CLI) *cobra.Command { + var ( + fromArg string + toArg string + levelArg string + followArg bool + dequoteArg bool + ) + cmd := &cobra.Command{ + Use: "log [relative-period]", + Short: "Show the Vespa log", + Long: `Show the Vespa log. The logs shown can be limited to a relative or fixed period. All timestamps are shown in UTC. Logs for the past hour are shown if no arguments are given. `, - Example: `$ vespa log 1h + Example: `$ vespa log 1h $ vespa log --nldequote=false 10m $ vespa log --from 2021-08-25T15:00:00Z --to 2021-08-26T02:00:00Z $ vespa log --follow`, - DisableAutoGenTag: true, - SilenceUsage: true, - Args: cobra.MaximumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - target, err := getTarget() - if err != nil { - return err - } - options := vespa.LogOptions{ - Level: vespa.LogLevel(levelArg), - Follow: followArg, - Writer: stdout, - Dequote: dequoteArg, - } - if options.Follow { - if fromArg != "" || toArg != "" || len(args) > 0 { - return fmt.Errorf("cannot combine --from/--to or relative time with --follow") - } - options.From = time.Now().Add(-5 * time.Minute) - } else { - from, to, err := parsePeriod(args) + DisableAutoGenTag: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + target, err := cli.target("", levelArg) if err != nil { - return fmt.Errorf("invalid period: %w", err) + return err } - options.From = from - options.To = to - } - if err := target.PrintLog(options); err != nil { - return fmt.Errorf("could not retrieve logs: %w", err) - } - return nil - }, + options := vespa.LogOptions{ + Level: vespa.LogLevel(levelArg), + Follow: followArg, + Writer: cli.Stdout, + Dequote: dequoteArg, + } + if options.Follow { + if fromArg != "" || toArg != "" || len(args) > 0 { + return fmt.Errorf("cannot combine --from/--to or relative time with --follow") + } + options.From = time.Now().Add(-5 * time.Minute) + } else { + from, to, err := parsePeriod(fromArg, toArg, args) + if err != nil { + return fmt.Errorf("invalid period: %w", err) + } + options.From = from + options.To = to + } + if err := target.PrintLog(options); err != nil { + return fmt.Errorf("could not retrieve logs: %w", err) + } + return nil + }, + } + cmd.Flags().StringVarP(&fromArg, "from", "F", "", "Include logs since this timestamp (RFC3339 format)") + cmd.Flags().StringVarP(&toArg, "to", "T", "", "Include logs until this timestamp (RFC3339 format)") + cmd.Flags().StringVarP(&levelArg, "level", "l", "debug", `The maximum log level to show. Must be "error", "warning", "info" or "debug"`) + cmd.Flags().BoolVarP(&followArg, "follow", "f", false, "Follow logs") + cmd.Flags().BoolVarP(&dequoteArg, "nldequote", "n", true, "Dequote LF and TAB characters in log messages") + return cmd } -func parsePeriod(args []string) (time.Time, time.Time, error) { - relativePeriod := fromArg == "" || toArg == "" +func parsePeriod(from, to string, args []string) (time.Time, time.Time, error) { + relativePeriod := from == "" || to == "" if relativePeriod { period := "1h" if len(args) > 0 { @@ -93,16 +91,16 @@ func parsePeriod(args []string) (time.Time, time.Time, error) { } else if len(args) > 0 { return time.Time{}, time.Time{}, fmt.Errorf("cannot combine --from/--to with relative value: %s", args[0]) } - from, err := time.Parse(time.RFC3339, fromArg) + t1, err := time.Parse(time.RFC3339, from) if err != nil { return time.Time{}, time.Time{}, err } - to, err := time.Parse(time.RFC3339, toArg) + t2, err := time.Parse(time.RFC3339, to) if err != nil { return time.Time{}, time.Time{}, err } - if !to.After(from) { + if !t2.After(t1) { return time.Time{}, time.Time{}, fmt.Errorf("--to must specify a time after --from") } - return from, to, nil + return t1, t2, nil } |