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