Files
2026-04-13 19:54:27 -04:00

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
}