mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 18:35:44 +03:00
* client/executor: refactor client to remove interpolation * executor: POC libcontainer based executor * vendor: use hashicorp libcontainer fork * vendor: add libcontainer/nsenter dep * executor: updated executor interface to simplify operations * executor: implement logging pipe * logmon: new logmon plugin to manage task logs * driver/executor: use logmon for log management * executor: fix tests and windows build * executor: fix logging key names * executor: fix test failures * executor: add config field to toggle between using libcontainer and standard executors * logmon: use discover utility to discover nomad executable * executor: only call libcontainer-shim on main in linux * logmon: use seperate path configs for stdout/stderr fifos * executor: windows fixes * executor: created reusable pid stats collection utility that can be used in an executor * executor: update fifo.Open calls * executor: fix build * remove executor from docker driver * executor: Shutdown func to kill and cleanup executor and its children * executor: move linux specific universal executor funcs to seperate file * move logmon initialization to a task runner hook * client: doc fixes and renaming from code review * taskrunner: use shared config struct for logmon fifo fields * taskrunner: logmon only needs to be started once per task
94 lines
1.7 KiB
Go
94 lines
1.7 KiB
Go
package logging
|
|
|
|
import (
|
|
"bufio"
|
|
"net"
|
|
"sync"
|
|
|
|
hclog "github.com/hashicorp/go-hclog"
|
|
)
|
|
|
|
// SyslogServer is a server which listens to syslog messages and parses them
|
|
type SyslogServer struct {
|
|
listener net.Listener
|
|
messages chan *SyslogMessage
|
|
parser *DockerLogParser
|
|
|
|
doneCh chan interface{}
|
|
done bool
|
|
doneLock sync.Mutex
|
|
|
|
logger hclog.Logger
|
|
}
|
|
|
|
// NewSyslogServer creates a new syslog server
|
|
func NewSyslogServer(l net.Listener, messages chan *SyslogMessage, logger hclog.Logger) *SyslogServer {
|
|
logger = logger.Named("logcollector.server")
|
|
parser := NewDockerLogParser(logger)
|
|
return &SyslogServer{
|
|
listener: l,
|
|
messages: messages,
|
|
parser: parser,
|
|
logger: logger,
|
|
doneCh: make(chan interface{}),
|
|
}
|
|
}
|
|
|
|
// Start starts accepting syslog connections
|
|
func (s *SyslogServer) Start() {
|
|
for {
|
|
select {
|
|
case <-s.doneCh:
|
|
return
|
|
default:
|
|
connection, err := s.listener.Accept()
|
|
if err != nil {
|
|
s.doneLock.Lock()
|
|
done := s.done
|
|
s.doneLock.Unlock()
|
|
if done {
|
|
return
|
|
}
|
|
|
|
s.logger.Error("error in accepting connection", "err", err)
|
|
continue
|
|
}
|
|
go s.read(connection)
|
|
}
|
|
}
|
|
}
|
|
|
|
// read reads the bytes from a connection
|
|
func (s *SyslogServer) read(connection net.Conn) {
|
|
defer connection.Close()
|
|
scanner := bufio.NewScanner(bufio.NewReader(connection))
|
|
|
|
for {
|
|
select {
|
|
case <-s.doneCh:
|
|
return
|
|
default:
|
|
}
|
|
if scanner.Scan() {
|
|
b := scanner.Bytes()
|
|
msg := s.parser.Parse(b)
|
|
s.messages <- msg
|
|
} else {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// Shutdown the syslog server
|
|
func (s *SyslogServer) Shutdown() {
|
|
s.doneLock.Lock()
|
|
defer s.doneLock.Unlock()
|
|
|
|
if !s.done {
|
|
close(s.doneCh)
|
|
close(s.messages)
|
|
s.done = true
|
|
s.listener.Close()
|
|
}
|
|
}
|