From 0b612aa0ccab278e1067bfd38bae1b21c2f19445 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Fri, 27 Feb 2026 11:51:50 +0100 Subject: [PATCH] Add logging.Init() to all cmd programs - anvilwebgw: init logging in startCmd - anvilweb: init logging in main - anvillm: init logging in main - Assist: init logging in main Each program now creates its own timestamped log file --- cmd/Assist/main.go | 19 +++++++++++++------ cmd/anvillm/main.go | 11 +++++++++-- cmd/anvilweb/main.go | 22 ++++++++++++++-------- cmd/anvilwebgw/main.go | 19 ++++++++++++------- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/cmd/Assist/main.go b/cmd/Assist/main.go index f6a7485..de88233 100644 --- a/cmd/Assist/main.go +++ b/cmd/Assist/main.go @@ -2,6 +2,7 @@ package main import ( + "anvillm/internal/logging" "encoding/json" "flag" "fmt" @@ -19,6 +20,7 @@ import ( "9fans.net/go/acme" "9fans.net/go/plan9" "9fans.net/go/plan9/client" + "go.uber.org/zap" ) const windowName = "/AnviLLM/" @@ -68,6 +70,11 @@ var ( ) func main() { + if err := logging.Init(); err != nil { + log.Fatalf("Failed to initialize logging: %v", err) + } + defer logging.Logger().Sync() + flag.Parse() // Connect to anvilsrv via 9P, auto-starting if needed @@ -75,11 +82,11 @@ func main() { fs, err = connectToServer() if err != nil { // Try to start anvilsrv automatically - log.Printf("anvilsrv not running, attempting to start...") + logging.Logger().Info("anvilsrv not running, attempting to start") startCmd := exec.Command("anvilsrv", "start") if err := startCmd.Run(); err != nil { - log.Printf("ERROR: Failed to start anvilsrv: %v", err) - log.Printf("Continuing without daemon connection. Use 'Daemon' command to manage server.") + logging.Logger().Error("failed to start anvilsrv", zap.Error(err)) + logging.Logger().Info("continuing without daemon connection") } else { // Wait a moment for daemon to initialize for i := 0; i < 20; i++ { @@ -91,8 +98,8 @@ func main() { } if err != nil { - log.Printf("ERROR: Failed to connect to anvilsrv after starting: %v", err) - log.Printf("Continuing without daemon connection. Use 'Daemon' command to manage server.") + logging.Logger().Error("failed to connect to anvilsrv after starting", zap.Error(err)) + logging.Logger().Info("continuing without daemon connection") } } } @@ -102,7 +109,7 @@ func main() { w, err := acme.New() if err != nil { - log.Fatal(err) + logging.Logger().Fatal("failed to create acme window", zap.Error(err)) } defer w.CloseFiles() diff --git a/cmd/anvillm/main.go b/cmd/anvillm/main.go index 1b99a1e..0b599e3 100644 --- a/cmd/anvillm/main.go +++ b/cmd/anvillm/main.go @@ -2,6 +2,7 @@ package main import ( + "anvillm/internal/logging" "encoding/json" "fmt" "log" @@ -16,6 +17,7 @@ import ( "9fans.net/go/plan9/client" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" + "go.uber.org/zap" ) var ( @@ -41,11 +43,16 @@ type SessionInfo struct { } func main() { + if err := logging.Init(); err != nil { + log.Fatalf("Failed to initialize logging: %v", err) + } + defer logging.Logger().Sync() + // Connect to anvilsrv var err error fs, err = connectToServer() if err != nil { - log.Fatalf("Failed to connect to anvilsrv: %v\nRun 'anvilsrv start' first", err) + logging.Logger().Fatal("failed to connect to anvilsrv", zap.Error(err)) } defer fs.Close() @@ -60,7 +67,7 @@ func main() { // Run application if err := app.SetRoot(pages, true).EnableMouse(true).Run(); err != nil { - log.Fatal(err) + logging.Logger().Fatal("application error", zap.Error(err)) } } diff --git a/cmd/anvilweb/main.go b/cmd/anvilweb/main.go index e9734c4..745a251 100644 --- a/cmd/anvilweb/main.go +++ b/cmd/anvilweb/main.go @@ -6,15 +6,16 @@ package main import ( + "anvillm/internal/logging" "embed" "flag" - "fmt" "io/fs" "log" "net/http" "net/http/httputil" "net/url" - "os" + + "go.uber.org/zap" ) //go:embed static/* @@ -26,17 +27,21 @@ var ( ) func main() { + if err := logging.Init(); err != nil { + log.Fatalf("Failed to initialize logging: %v", err) + } + defer logging.Logger().Sync() + flag.Parse() gwURL, err := url.Parse(*gwAddr) if err != nil { - fmt.Fprintf(os.Stderr, "Invalid gateway URL %q: %v\n", *gwAddr, err) - os.Exit(1) + logging.Logger().Fatal("invalid gateway URL", zap.String("url", *gwAddr), zap.Error(err)) } staticFS, err := fs.Sub(static, "static") if err != nil { - log.Fatal(err) + logging.Logger().Fatal("failed to load static files", zap.Error(err)) } // Reverse proxy for /api/* to anvilwebgw @@ -46,7 +51,8 @@ func main() { mux.Handle("/api/", proxy) mux.Handle("/", http.FileServer(http.FS(staticFS))) - log.Printf("Starting anvilweb on %s", *addr) - log.Printf("Proxying /api/* to %s", *gwAddr) - log.Fatal(http.ListenAndServe(*addr, mux)) + logging.Logger().Info("starting anvilweb", zap.String("addr", *addr), zap.String("gateway", *gwAddr)) + if err := http.ListenAndServe(*addr, mux); err != nil { + logging.Logger().Fatal("server error", zap.Error(err)) + } } diff --git a/cmd/anvilwebgw/main.go b/cmd/anvilwebgw/main.go index b465283..4842c2d 100644 --- a/cmd/anvilwebgw/main.go +++ b/cmd/anvilwebgw/main.go @@ -5,6 +5,7 @@ package main import ( + "anvillm/internal/logging" "encoding/json" "flag" "fmt" @@ -22,6 +23,7 @@ import ( "9fans.net/go/plan9" "9fans.net/go/plan9/client" + "go.uber.org/zap" ) const terminalCommand = "foot" @@ -77,12 +79,17 @@ func usage() { } func startCmd(daemonize bool) { + if err := logging.Init(); err != nil { + log.Fatalf("Failed to initialize logging: %v", err) + } + defer logging.Logger().Sync() + pidFile := getPidFilePath() // Check if already running before daemonizing if existingPid := readPidFile(); existingPid != 0 { if isProcessRunning(existingPid) { - log.Fatalf("anvilwebgw already running (PID %d)", existingPid) + logging.Logger().Fatal("anvilwebgw already running", zap.Int("pid", existingPid)) } // Stale PID file os.Remove(pidFile) @@ -93,7 +100,7 @@ func startCmd(daemonize bool) { if os.Getenv("ANVILWEBGW_DAEMON") != "1" { cmd, err := os.Executable() if err != nil { - log.Fatalf("Failed to get executable path: %v", err) + logging.Logger().Fatal("failed to get executable path", zap.Error(err)) } // Reconstruct args: flags + fgstart fwdArgs := []string{"fgstart"} @@ -180,16 +187,14 @@ func startCmd(daemonize bool) { go func() { sig := <-sigChan - log.Printf("Received signal %v, shutting down", sig) + logging.Logger().Info("received signal, shutting down", zap.String("signal", sig.String())) server.Close() }() - log.Printf("anvilwebgw started successfully") - log.Printf("HTTP gateway listening on %s", *addr) - log.Printf("Using 9P namespace: %s", *namespace) + logging.Logger().Info("anvilwebgw started successfully", zap.String("addr", *addr), zap.String("namespace", *namespace)) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { - log.Fatal(err) + logging.Logger().Fatal("server error", zap.Error(err)) } }