|  | @@ -88,15 +88,17 @@ func (s *composeService) Logs(ctx context.Context, projectName string, consumer
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type splitBuffer struct {
 | 
	
		
			
				|  |  | +	buffer    bytes.Buffer
 | 
	
		
			
				|  |  |  	name      string
 | 
	
		
			
				|  |  | +	service   string
 | 
	
		
			
				|  |  |  	container string
 | 
	
		
			
				|  |  |  	consumer  compose.ContainerEventListener
 | 
	
		
			
				|  |  | -	service   string
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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{
 | 
	
		
			
				|  |  | +	return &splitBuffer{
 | 
	
		
			
				|  |  | +		buffer:    bytes.Buffer{},
 | 
	
		
			
				|  |  |  		name:      name,
 | 
	
		
			
				|  |  |  		service:   service,
 | 
	
		
			
				|  |  |  		container: container,
 | 
	
	
		
			
				|  | @@ -104,18 +106,26 @@ func getWriter(name, service, container string, events compose.ContainerEventLis
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -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(compose.ContainerEvent{
 | 
	
		
			
				|  |  | -				Type:    compose.ContainerEventLog,
 | 
	
		
			
				|  |  | -				Name:    s.name,
 | 
	
		
			
				|  |  | -				Service: s.service,
 | 
	
		
			
				|  |  | -				Source:  s.container,
 | 
	
		
			
				|  |  | -				Line:    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
 | 
	
		
			
				|  |  |  }
 |