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 }