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  }