feat: stderr only for logs

This commit is contained in:
decentral1se 2021-12-22 01:02:36 +01:00
parent 6be2f36334
commit 56a1e7f8c4
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
2 changed files with 64 additions and 42 deletions

View File

@ -9,6 +9,7 @@ import (
"coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/config"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
dockerClient "github.com/docker/docker/client" dockerClient "github.com/docker/docker/client"
@ -16,6 +17,15 @@ import (
"github.com/urfave/cli/v2" "github.com/urfave/cli/v2"
) )
var logOpts = types.ContainerLogsOptions{
Details: false,
Follow: true,
ShowStderr: true,
ShowStdout: true,
Tail: "20",
Timestamps: true,
}
// stackLogs lists logs for all stack services // stackLogs lists logs for all stack services
func stackLogs(c *cli.Context, stackName string, client *dockerClient.Client) { func stackLogs(c *cli.Context, stackName string, client *dockerClient.Client) {
filters := filters.NewArgs() filters := filters.NewArgs()
@ -30,14 +40,10 @@ func stackLogs(c *cli.Context, stackName string, client *dockerClient.Client) {
for _, service := range services { for _, service := range services {
wg.Add(1) wg.Add(1)
go func(s string) { go func(s string) {
logOpts := types.ContainerLogsOptions{ if internal.StdErrOnly {
Details: false, logOpts.ShowStdout = false
Follow: true,
ShowStderr: true,
ShowStdout: true,
Tail: "20",
Timestamps: true,
} }
logs, err := client.ServiceLogs(c.Context, s, logOpts) logs, err := client.ServiceLogs(c.Context, s, logOpts)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
@ -60,6 +66,10 @@ var appLogsCommand = &cli.Command{
Aliases: []string{"l"}, Aliases: []string{"l"},
ArgsUsage: "[<service>]", ArgsUsage: "[<service>]",
Usage: "Tail app logs", Usage: "Tail app logs",
Flags: []cli.Flag{
internal.StdErrOnlyFlag,
},
BashComplete: autocomplete.AppNameComplete,
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
app := internal.ValidateApp(c) app := internal.ValidateApp(c)
@ -70,44 +80,47 @@ var appLogsCommand = &cli.Command{
serviceName := c.Args().Get(1) serviceName := c.Args().Get(1)
if serviceName == "" { if serviceName == "" {
logrus.Debug("tailing logs for all app services") logrus.Debugf("tailing logs for all %s services", app.Type)
stackLogs(c, app.StackName(), cl) stackLogs(c, app.StackName(), cl)
} } else {
logrus.Debugf("tailing logs for '%s'", serviceName) logrus.Debugf("tailing logs for %s", serviceName)
if err := tailServiceLogs; err != nil {
service := fmt.Sprintf("%s_%s", app.StackName(), serviceName) logrus.Fatal(err)
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))
}
logOpts := types.ContainerLogsOptions{
Details: false,
Follow: true,
ShowStderr: true,
ShowStdout: true,
Tail: "20",
Timestamps: true,
}
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 return nil
}, },
BashComplete: autocomplete.AppNameComplete, }
func tailServiceLogs(c *cli.Context, cl *dockerClient.Client, app config.App, serviceName string) error {
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))
}
if internal.StdErrOnly {
logOpts.ShowStdout = false
}
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
} }

View File

@ -401,6 +401,15 @@ var NoDomainChecksFlag = &cli.BoolFlag{
Destination: &NoDomainChecks, Destination: &NoDomainChecks,
} }
var StdErrOnly bool
var StdErrOnlyFlag = &cli.BoolFlag{
Name: "stderr",
Aliases: []string{"s"},
Value: false,
Usage: "Only tail stderr",
Destination: &StdErrOnly,
}
// SSHFailMsg is a hopefully helpful SSH failure message // SSHFailMsg is a hopefully helpful SSH failure message
var SSHFailMsg = ` var SSHFailMsg = `
Woops, Abra is unable to connect to connect to %s. Woops, Abra is unable to connect to connect to %s.