forked from toolshed/coop-cloud-backend
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package status
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/docker/docker/api/types/swarm"
|
|
dockerClient "github.com/docker/docker/client"
|
|
containerTypes "github.com/docker/docker/api/types/container"
|
|
)
|
|
func StreamLogs(
|
|
ctx context.Context,
|
|
cl *dockerClient.Client,
|
|
services []swarm.Service,
|
|
logCh chan <- string,
|
|
) error {
|
|
waitCh := make(chan struct{})
|
|
var wg sync.WaitGroup
|
|
for _, service := range services {
|
|
wg.Add(1)
|
|
go func(serviceID string) {
|
|
defer wg.Done()
|
|
tail := "50"
|
|
|
|
logs, err := cl.ServiceLogs(ctx, serviceID, containerTypes.LogsOptions{
|
|
ShowStderr: true,
|
|
ShowStdout: true,
|
|
Until: "",
|
|
Timestamps: true,
|
|
Follow: true,
|
|
Tail: tail,
|
|
Details: false,
|
|
})
|
|
|
|
if err == nil {
|
|
buf := bufio.NewScanner(logs)
|
|
for buf.Scan() {
|
|
select {
|
|
case <- ctx.Done():
|
|
return
|
|
default:
|
|
line := fmt.Sprintf("%s: %s", service.Spec.Name, buf.Text())
|
|
logCh <- line
|
|
}
|
|
}
|
|
logs.Close()
|
|
return
|
|
}
|
|
}(service.ID)
|
|
}
|
|
|
|
wg.Wait()
|
|
close(waitCh)
|
|
close(logCh)
|
|
return nil
|
|
} |