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
This commit is contained in:
Levi Neely 2026-02-27 11:51:50 +01:00
parent 521f785313
commit 0b612aa0cc
4 changed files with 48 additions and 23 deletions

View File

@ -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()

View File

@ -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))
}
}

View File

@ -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))
}
}

View File

@ -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))
}
}