|
|
@@ -23,15 +23,6 @@ import (
|
|
|
"github.com/docker/compose-cli/api/compose"
|
|
|
)
|
|
|
|
|
|
-// GetWriter creates a io.Writer that will actually split by line and format by LogConsumer
|
|
|
-func GetWriter(service, container string, l compose.LogConsumer) io.Writer {
|
|
|
- return splitBuffer{
|
|
|
- service: service,
|
|
|
- container: container,
|
|
|
- consumer: l,
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// FilteredLogConsumer filters logs for given services
|
|
|
func FilteredLogConsumer(consumer compose.LogConsumer, services []string) compose.LogConsumer {
|
|
|
if len(services) == 0 {
|
|
|
@@ -52,36 +43,63 @@ type allowListLogConsumer struct {
|
|
|
delegate compose.LogConsumer
|
|
|
}
|
|
|
|
|
|
-func (a *allowListLogConsumer) Log(service, container, message string) {
|
|
|
- if a.allowList[service] {
|
|
|
- a.delegate.Log(service, container, message)
|
|
|
+func (a *allowListLogConsumer) Log(name, container, message string) {
|
|
|
+ if a.allowList[name] {
|
|
|
+ a.delegate.Log(name, container, message)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (a *allowListLogConsumer) Status(service, container, message string) {
|
|
|
- if a.allowList[service] {
|
|
|
- a.delegate.Status(service, container, message)
|
|
|
+func (a *allowListLogConsumer) Status(name, container, message string) {
|
|
|
+ if a.allowList[name] {
|
|
|
+ a.delegate.Status(name, container, message)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (a *allowListLogConsumer) Register(service string, source string) {
|
|
|
- if a.allowList[service] {
|
|
|
- a.delegate.Register(service, source)
|
|
|
+func (a *allowListLogConsumer) Register(name string, source string) {
|
|
|
+ if a.allowList[name] {
|
|
|
+ a.delegate.Register(name, source)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// GetWriter creates a io.Writer that will actually split by line and format by LogConsumer
|
|
|
+func GetWriter(name, service, container string, events compose.ContainerEventListener) io.Writer {
|
|
|
+ return &splitBuffer{
|
|
|
+ buffer: bytes.Buffer{},
|
|
|
+ name: name,
|
|
|
+ service: service,
|
|
|
+ container: container,
|
|
|
+ consumer: events,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
type splitBuffer struct {
|
|
|
+ buffer bytes.Buffer
|
|
|
+ name string
|
|
|
service string
|
|
|
container string
|
|
|
- consumer compose.LogConsumer
|
|
|
+ consumer compose.ContainerEventListener
|
|
|
}
|
|
|
|
|
|
-func (s splitBuffer) Write(b []byte) (n int, err error) {
|
|
|
- split := bytes.Split(b, []byte{'\n'})
|
|
|
- for _, line := range split {
|
|
|
- if len(line) != 0 {
|
|
|
- s.consumer.Log(s.service, s.container, string(line))
|
|
|
+// Write implements io.Writer. joins all input, splits on the separator and yields each chunk
|
|
|
+func (s *splitBuffer) Write(b []byte) (int, error) {
|
|
|
+ n, err := s.buffer.Write(b)
|
|
|
+ if err != nil {
|
|
|
+ return n, err
|
|
|
+ }
|
|
|
+ for {
|
|
|
+ b = s.buffer.Bytes()
|
|
|
+ index := bytes.Index(b, []byte{'\n'})
|
|
|
+ if index < 0 {
|
|
|
+ break
|
|
|
}
|
|
|
+ line := s.buffer.Next(index + 1)
|
|
|
+ s.consumer(compose.ContainerEvent{
|
|
|
+ Type: compose.ContainerEventLog,
|
|
|
+ Name: s.name,
|
|
|
+ Service: s.service,
|
|
|
+ Source: s.container,
|
|
|
+ Line: string(line[:len(line)-1]),
|
|
|
+ })
|
|
|
}
|
|
|
- return len(b), nil
|
|
|
+ return n, nil
|
|
|
}
|