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  }