github.com/henvic/wedeploycli@v1.7.6-0.20200319005353-3630f582f284/command/log/log.go (about) 1 package log 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "strings" 8 9 "github.com/hashicorp/errwrap" 10 "github.com/henvic/ctxsignal" 11 "github.com/henvic/wedeploycli/cmdflagsfromhost" 12 "github.com/henvic/wedeploycli/command/internal/we" 13 "github.com/henvic/wedeploycli/logs" 14 "github.com/spf13/cobra" 15 ) 16 17 var ( 18 level string 19 since string 20 watch bool 21 ) 22 23 var setupHost = cmdflagsfromhost.SetupHost{ 24 Pattern: cmdflagsfromhost.FullHostPattern | cmdflagsfromhost.InstancePattern, 25 26 Requires: cmdflagsfromhost.Requires{ 27 Auth: true, 28 Project: true, 29 }, 30 31 PromptMissingProject: true, 32 } 33 34 func init() { 35 setupHost.Init(LogCmd) 36 } 37 38 // LogCmd is used for getting logs about a given scope 39 var LogCmd = &cobra.Command{ 40 Use: "log", 41 Short: "Show logs of the services", 42 PreRunE: preRun, 43 RunE: logRun, 44 Args: cobra.NoArgs, 45 Example: ` lcp log --project chat --service data 46 lcp log --service data 47 lcp log --project chat --service data 48 lcp log --url data-chat.lfr.cloud 49 lcp log --url data-chat.lfr.cloud --instance 10ab22`, 50 } 51 52 func preRun(cmd *cobra.Command, args []string) error { 53 return setupHost.Process(context.Background(), we.Context()) 54 } 55 56 func logRun(cmd *cobra.Command, args []string) error { 57 var project = setupHost.Project() 58 var service = setupHost.Service() 59 var instance = setupHost.Instance() 60 61 if len(args) > 2 { 62 return errors.New("invalid number of arguments") 63 } 64 65 var t, err = getSince() 66 67 if err != nil { 68 return err 69 } 70 71 f := &logs.Filter{ 72 Project: project, 73 Instance: instance, 74 Level: level, 75 Since: t, 76 } 77 78 if service != "" { 79 f.Services = strings.Split(service, ",") 80 } 81 82 if !watch { 83 logsClient := logs.New(we.Context()) 84 return logsClient.List(context.Background(), f) 85 } 86 87 watcher := &logs.Watcher{ 88 Filter: f, 89 } 90 91 ctx, cancel := ctxsignal.WithTermination(context.Background()) 92 defer cancel() 93 94 watcher.Watch(ctx, we.Context()) 95 96 if _, err := ctxsignal.Closed(ctx); err == nil { 97 fmt.Println() 98 } 99 100 return nil 101 } 102 103 func getSince() (string, error) { 104 if since == "" { 105 return "", nil 106 } 107 108 t, err := logs.GetUnixTimestamp(since) 109 110 if err != nil { 111 return "", errwrap.Wrapf("can't parse since argument: {{err}}.", err) 112 } 113 114 // use nanoseconds instead of seconds (console takes ns as a param) 115 return fmt.Sprintf("%v000000000", t), err 116 } 117 118 func init() { 119 LogCmd.Flags().StringVar(&level, "level", "", `Severity (critical, error, warning, info (default), debug)`) 120 LogCmd.Flag("level").Hidden = true 121 122 LogCmd.Flags().StringVar(&since, "since", "", "Show since moment (i.e., 20min, 3h, UNIX timestamp)") 123 LogCmd.Flags().BoolVarP(&watch, "watch", "w", true, "Watch / follow log output") 124 _ = LogCmd.Flags().MarkHidden("watch") 125 }