github.com/ranjib/nomad@v0.1.1-0.20160225204057-97751b02f70b/client/driver/logging/syslog_server.go (about)

     1  // +build !windows
     2  
     3  package logging
     4  
     5  import (
     6  	"bufio"
     7  	"log"
     8  	"net"
     9  )
    10  
    11  // SyslogServer is a server which listens to syslog messages and parses them
    12  type SyslogServer struct {
    13  	listener net.Listener
    14  	messages chan *SyslogMessage
    15  	parser   *DockerLogParser
    16  
    17  	doneCh chan interface{}
    18  	logger *log.Logger
    19  }
    20  
    21  // NewSyslogServer creates a new syslog server
    22  func NewSyslogServer(l net.Listener, messages chan *SyslogMessage, logger *log.Logger) *SyslogServer {
    23  	parser := NewDockerLogParser(logger)
    24  	return &SyslogServer{
    25  		listener: l,
    26  		messages: messages,
    27  		parser:   parser,
    28  		logger:   logger,
    29  		doneCh:   make(chan interface{}),
    30  	}
    31  }
    32  
    33  // Start starts accepting syslog connections
    34  func (s *SyslogServer) Start() {
    35  	for {
    36  		select {
    37  		case <-s.doneCh:
    38  			s.listener.Close()
    39  			return
    40  		default:
    41  			connection, err := s.listener.Accept()
    42  			if err != nil {
    43  				s.logger.Printf("[ERR] logcollector.server: error in accepting connection: %v", err)
    44  				continue
    45  			}
    46  			go s.read(connection)
    47  		}
    48  	}
    49  }
    50  
    51  // read reads the bytes from a connection
    52  func (s *SyslogServer) read(connection net.Conn) {
    53  	defer connection.Close()
    54  	scanner := bufio.NewScanner(bufio.NewReader(connection))
    55  
    56  	for {
    57  		select {
    58  		case <-s.doneCh:
    59  			return
    60  		default:
    61  		}
    62  		if scanner.Scan() {
    63  			b := scanner.Bytes()
    64  			msg := s.parser.Parse(b)
    65  			s.messages <- msg
    66  		} else {
    67  			return
    68  		}
    69  	}
    70  }
    71  
    72  // Shutdown shutsdown the syslog server
    73  func (s *SyslogServer) Shutdown() {
    74  	close(s.doneCh)
    75  	close(s.messages)
    76  }