From 03789b8ed383c2816232efe7dbf5e372535a916d Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Sat, 4 Feb 2017 02:01:52 +0000 Subject: [PATCH] add ctoplogger, log facility, socket server --- config.go | 11 ++++--- logging/main.go | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 3 ++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 logging/main.go diff --git a/config.go b/config.go index 26b2b09..3364292 100644 --- a/config.go +++ b/config.go @@ -33,11 +33,12 @@ func NewDefaultConfig() Config { docker = "unix:///var/run/docker.sock" } config := Config{ - "dockerHost": docker, - "filterStr": "", - "sortField": "id", - "sortReverse": "0", - "enableHeader": "0", + "dockerHost": docker, + "filterStr": "", + "sortField": "id", + "sortReverse": "0", + "enableHeader": "0", + "loggingEnabled": "1", } go func() { for m := range configChan { diff --git a/logging/main.go b/logging/main.go new file mode 100644 index 0000000..67cd406 --- /dev/null +++ b/logging/main.go @@ -0,0 +1,82 @@ +package logging + +import ( + "net" + "time" + + "github.com/op/go-logging" +) + +const ( + size = 64 + path = "/tmp/ctop.sock" +) + +var format = logging.MustStringFormatter( + `%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`, +) + +type CTopLogger struct { + *logging.Logger + backend *logging.MemoryBackend +} + +func (log *CTopLogger) Serve() { + ln, err := net.Listen("unix", path) + if err != nil { + panic(err) + } + + for { + conn, err := ln.Accept() + if err != nil { + panic(err) + } + go log.handler(conn) + } +} + +func (log *CTopLogger) handler(conn net.Conn) { + defer conn.Close() + for msg := range log.tail() { + conn.Write([]byte(msg)) + } +} + +func (log *CTopLogger) tail() chan string { + stream := make(chan string) + + node := log.backend.Head() + go func() { + for { + stream <- node.Record.Formatted(0) + for { + nnode := node.Next() + if nnode != nil { + node = nnode + break + } + time.Sleep(1 * time.Second) + } + } + }() + + return stream +} + +func New(serverEnabled string) *CTopLogger { + + log := &CTopLogger{ + logging.MustGetLogger("ctop"), + logging.NewMemoryBackend(size), + } + + logging.SetBackend(logging.NewBackendFormatter(log.backend, format)) + log.Info("initialized logging") + + if serverEnabled == "1" { + go log.Serve() + } + + return log +} diff --git a/main.go b/main.go index f2dd8ce..111b95c 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,12 @@ package main import ( + "github.com/bcicen/ctop/logging" ui "github.com/gizak/termui" ) +var log = logging.New(GlobalConfig["loggingEnabled"]) + func main() { if err := ui.Init(); err != nil { panic(err)