package app import ( "fmt" "io" "os" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var appLogsCommand = &cli.Command{ Name: "logs", Aliases: []string{"l"}, ArgsUsage: "[]", Usage: "Tail app logs", Flags: []cli.Flag{ internal.StderrFlag, internal.StdoutFlag, internal.HealthcheckFlag, }, Action: func(c *cli.Context) error { app := internal.ValidateApp(c) if !internal.Stderr && !internal.Stdout && !internal.Healthcheck { internal.Stderr = true internal.Stdout = true internal.Healthcheck = true } logrus.Debugf("flags parsed. --stderr: %t, --stdout: %t, --healthcheck: %t", internal.Stderr, internal.Stdout, internal.Healthcheck) cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) } logOpts := types.ContainerLogsOptions{ Details: false, Follow: true, ShowStderr: internal.Stderr, ShowStdout: internal.Stdout, Tail: "20", Timestamps: true, } serviceName := c.Args().Get(1) if serviceName == "" { logrus.Debug("tailing logs for all app services") internal.StackLogs(c, app.StackName(), logOpts, cl) } logrus.Debugf("tailing logs for '%s'", serviceName) service := fmt.Sprintf("%s_%s", app.StackName(), serviceName) filters := filters.NewArgs() filters.Add("name", service) serviceOpts := types.ServiceListOptions{Filters: filters} services, err := cl.ServiceList(c.Context, serviceOpts) if err != nil { logrus.Fatal(err) } if len(services) != 1 { logrus.Fatalf("expected 1 service but got %v", len(services)) } logs, err := cl.ServiceLogs(c.Context, services[0].ID, logOpts) if err != nil { logrus.Fatal(err) } // defer after err check as any err returns a nil io.ReadCloser defer logs.Close() _, err = io.Copy(os.Stdout, logs) if err != nil && err != io.EOF { logrus.Fatal(err) } return nil }, BashComplete: func(c *cli.Context) { appNames, err := config.GetAppNames() if err != nil { logrus.Warn(err) } if c.NArg() > 0 { return } for _, a := range appNames { fmt.Println(a) } }, }