add waitgroup, exit handlers to logging server

This commit is contained in:
Bradley Cicenas 2017-02-05 00:25:30 +00:00
parent 2b279efc4e
commit 198d4974e3
2 changed files with 20 additions and 16 deletions

View File

@ -3,6 +3,7 @@ package logging
import ( import (
"fmt" "fmt"
"net" "net"
"sync"
"time" "time"
"github.com/op/go-logging" "github.com/op/go-logging"
@ -16,23 +17,23 @@ const (
var format = logging.MustStringFormatter( var format = logging.MustStringFormatter(
`%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`, `%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`,
) )
var exited bool
var wg sync.WaitGroup
type CTopLogger struct { type CTopLogger struct {
*logging.Logger *logging.Logger
backend *logging.MemoryBackend backend *logging.MemoryBackend
done chan bool
} }
func New(serverEnabled string) *CTopLogger { func New(serverEnabled string) *CTopLogger {
log := &CTopLogger{ log := &CTopLogger{
logging.MustGetLogger("ctop"), logging.MustGetLogger("ctop"),
logging.NewMemoryBackend(size), logging.NewMemoryBackend(size),
make(chan bool),
} }
backendFmt := logging.NewBackendFormatter(log.backend, format) backendFmt := logging.NewBackendFormatter(log.backend, format)
logging.SetBackend(backendFmt) logging.SetBackend(backendFmt)
log.Info("logger initialized") log.Notice("logger initialized")
if serverEnabled == "1" { if serverEnabled == "1" {
log.Serve() log.Serve()
@ -42,7 +43,8 @@ func New(serverEnabled string) *CTopLogger {
} }
func (log *CTopLogger) Exit() { func (log *CTopLogger) Exit() {
log.done <- true exited = true
wg.Wait()
} }
func (log *CTopLogger) Serve() { func (log *CTopLogger) Serve() {
@ -51,35 +53,31 @@ func (log *CTopLogger) Serve() {
panic(err) panic(err)
} }
go func() {
switch {
case <-log.done:
ln.Close()
return
default:
//
}
}()
go func() { go func() {
for { for {
conn, err := ln.Accept() conn, err := ln.Accept()
if err != nil { if err != nil {
panic(err) if err, ok := err.(net.Error); ok && err.Temporary() {
continue
}
return
} }
go log.handler(conn) go log.handler(conn)
} }
}() }()
log.Info("logging server started") log.Notice("logging server started")
} }
func (log *CTopLogger) handler(conn net.Conn) { func (log *CTopLogger) handler(conn net.Conn) {
wg.Add(1)
defer wg.Done()
defer conn.Close() defer conn.Close()
for msg := range log.tail() { for msg := range log.tail() {
msg = fmt.Sprintf("%s\n", msg) msg = fmt.Sprintf("%s\n", msg)
conn.Write([]byte(msg)) conn.Write([]byte(msg))
} }
conn.Write([]byte("bye\n"))
} }
func (log *CTopLogger) tail() chan string { func (log *CTopLogger) tail() chan string {
@ -95,6 +93,10 @@ func (log *CTopLogger) tail() chan string {
node = nnode node = nnode
break break
} }
if exited {
close(stream)
return
}
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
} }
} }

View File

@ -17,6 +17,8 @@ func main() {
for { for {
exit := Display(g) exit := Display(g)
if exit { if exit {
log.Notice("shutting down")
log.Exit()
return return
} }
} }