瀏覽代碼

Merge pull request #534 from docker/interupt

Poll ECS logs until context is canceled
Guillaume Tardif 5 年之前
父節點
當前提交
d85d963705
共有 2 個文件被更改,包括 27 次插入31 次删除
  1. 1 10
      ecs/logs.go
  2. 26 21
      ecs/sdk.go

+ 1 - 10
ecs/logs.go

@@ -21,8 +21,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"os"
-	"os/signal"
 	"strconv"
 	"strings"
 
@@ -45,14 +43,7 @@ func (b *ecsAPIService) Logs(ctx context.Context, options *cli.ProjectOptions, w
 		writer: writer,
 	}
 	err := b.SDK.GetLogs(ctx, name, consumer.Log)
-	if err != nil {
-		return err
-	}
-
-	signalChan := make(chan os.Signal, 1)
-	signal.Notify(signalChan, os.Interrupt)
-	<-signalChan
-	return nil
+	return err
 }
 
 func (l *logConsumer) Log(service, container, message string) {

+ 26 - 21
ecs/sdk.go

@@ -436,27 +436,32 @@ func (s sdk) GetLogs(ctx context.Context, name string, consumer func(service, co
 	logGroup := fmt.Sprintf("/docker-compose/%s", name)
 	var startTime int64
 	for {
-		var hasMore = true
-		var token *string
-		for hasMore {
-			events, err := s.CW.FilterLogEvents(&cloudwatchlogs.FilterLogEventsInput{
-				LogGroupName: aws.String(logGroup),
-				NextToken:    token,
-				StartTime:    aws.Int64(startTime),
-			})
-			if err != nil {
-				return err
-			}
-			if events.NextToken == nil {
-				hasMore = false
-			} else {
-				token = events.NextToken
-			}
-
-			for _, event := range events.Events {
-				p := strings.Split(aws.StringValue(event.LogStreamName), "/")
-				consumer(p[1], p[2], aws.StringValue(event.Message))
-				startTime = *event.IngestionTime
+		select {
+		case <-ctx.Done():
+			return nil
+		default:
+			var hasMore = true
+			var token *string
+			for hasMore {
+				events, err := s.CW.FilterLogEvents(&cloudwatchlogs.FilterLogEventsInput{
+					LogGroupName: aws.String(logGroup),
+					NextToken:    token,
+					StartTime:    aws.Int64(startTime),
+				})
+				if err != nil {
+					return err
+				}
+				if events.NextToken == nil {
+					hasMore = false
+				} else {
+					token = events.NextToken
+				}
+
+				for _, event := range events.Events {
+					p := strings.Split(aws.StringValue(event.LogStreamName), "/")
+					consumer(p[1], p[2], aws.StringValue(event.Message))
+					startTime = *event.IngestionTime
+				}
 			}
 		}
 		time.Sleep(500 * time.Millisecond)