From dcf5090754e95b5a28cc29013994731b09e7eb1b Mon Sep 17 00:00:00 2001 From: Brendan Kerrigan Date: Wed, 18 Sep 2024 21:29:56 +0000 Subject: [PATCH] Add a TUI logger view to see the logger live Signed-off-by: Brendan Kerrigan --- src/cmd/main.go | 3 +++ src/pkg/logger/logger.go | 35 ++++++++++++++++++++++++++++++++- src/pkg/resourceviews/tuilog.go | 32 ++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/pkg/resourceviews/tuilog.go diff --git a/src/cmd/main.go b/src/cmd/main.go index 331de77..2164e2a 100644 --- a/src/cmd/main.go +++ b/src/cmd/main.go @@ -54,6 +54,9 @@ func NewAzTuiState() *AzTuiState { a.App.SetFocus(subscriptionList.List) }) + tl := resourceviews.NewTUILogView(a.AppLayout) + a.AppLayout.AppendPrimitiveView(subscriptionList.List, true, 1) + a.AppLayout.AppendPrimitiveView(tl.View, false, 3) return &a } diff --git a/src/pkg/logger/logger.go b/src/pkg/logger/logger.go index 95444ec..c286b5c 100644 --- a/src/pkg/logger/logger.go +++ b/src/pkg/logger/logger.go @@ -1,22 +1,55 @@ package logger import ( + "bytes" + "io" "log" "os" + "sync" ) +// Logger is the global logger instance. var Logger *log.Logger +// buffer holds the in-memory log messages. +var buffer bytes.Buffer + +// bufferMutex protects access to the buffer. +var bufferMutex sync.Mutex + +// InitLogger initializes the logger to write to both a file and an in-memory buffer. func InitLogger() error { + // Open or create the log file. f, err := os.OpenFile("aztui.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { return err } - Logger = log.New(f, "", log.LstdFlags) + + // Create a MultiWriter to write to both the file and the buffer. + mw := io.MultiWriter(f, &buffer) + + // Initialize the logger. + Logger = log.New(mw, "", log.LstdFlags) Logger.Println("Starting log") + return nil } +// Println logs a message using the global Logger. func Println(v ...interface{}) { Logger.Println(v...) } + +// GetLogs returns the current contents of the in-memory log buffer. +func GetLogs() string { + bufferMutex.Lock() + defer bufferMutex.Unlock() + return buffer.String() +} + +// ClearLogs clears the in-memory log buffer. +func ClearLogs() { + bufferMutex.Lock() + defer bufferMutex.Unlock() + buffer.Reset() +} diff --git a/src/pkg/resourceviews/tuilog.go b/src/pkg/resourceviews/tuilog.go new file mode 100644 index 0000000..f4a19c9 --- /dev/null +++ b/src/pkg/resourceviews/tuilog.go @@ -0,0 +1,32 @@ +package resourceviews + +import ( + "time" + "github.com/rivo/tview" + + "github.com/brendank310/aztui/pkg/layout" + "github.com/brendank310/aztui/pkg/logger" +) + +type TUILogView struct { + View *tview.TextView + Parent *layout.AppLayout +} + +func NewTUILogView(appLayout *layout.AppLayout) *TUILogView { + tl := TUILogView{ + View: tview.NewTextView(), + Parent: appLayout, + } + + tl.View.SetBorder(true) + tl.View.SetTitle("AzTUI Log") + go func(t *TUILogView) { + logs := logger.GetLogs() + t.View.Write([]byte(logs)) + logger.ClearLogs() + time.Sleep(1*time.Second) + }(&tl) + + return &tl +}