Implement milestone 6b workbench routing skeleton
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
// Package debug provides a debug logger that writes to a file.
|
||||
// Enabled with --debug CLI flag.
|
||||
package debug
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
logger *log.Logger
|
||||
mu sync.Mutex
|
||||
enabled bool
|
||||
)
|
||||
|
||||
// Init initializes the debug logger. If --debug is present in args,
|
||||
// it writes to ~/.local/share/verstak/debug/verstak-YYYY-MM-DD-HHMMSS.log.
|
||||
// Returns true if debug mode is enabled.
|
||||
func Init(args []string) bool {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
for _, a := range args {
|
||||
if a == "--debug" {
|
||||
enabled = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !enabled {
|
||||
return false
|
||||
}
|
||||
|
||||
// Create log directory
|
||||
logDir := filepath.Join(os.Getenv("HOME"), ".local", "share", "verstak", "debug")
|
||||
if err := os.MkdirAll(logDir, 0755); err != nil {
|
||||
log.Printf("[debug] failed to create log dir %s: %v", logDir, err)
|
||||
// Fallback to /tmp
|
||||
logDir = filepath.Join(os.TempDir(), "verstak-debug")
|
||||
os.MkdirAll(logDir, 0755)
|
||||
}
|
||||
|
||||
// Create log file with timestamp
|
||||
timestamp := time.Now().Format("2006-01-02-150405")
|
||||
logFile := filepath.Join(logDir, fmt.Sprintf("verstak-%s.log", timestamp))
|
||||
|
||||
f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err != nil {
|
||||
log.Printf("[debug] failed to open log file %s: %v", logFile, err)
|
||||
return true // Still enabled, but logging to stderr
|
||||
}
|
||||
|
||||
// Write to both file and stderr
|
||||
mw := io.MultiWriter(f, os.Stderr)
|
||||
logger = log.New(mw, "", log.LstdFlags|log.Lmicroseconds)
|
||||
|
||||
log.Printf("[debug] logger initialized: %s", logFile)
|
||||
return true
|
||||
}
|
||||
|
||||
// IsEnabled returns whether debug mode is active.
|
||||
func IsEnabled() bool {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
return enabled
|
||||
}
|
||||
|
||||
// Logf writes a formatted debug message.
|
||||
func Logf(format string, v ...interface{}) {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
if !enabled {
|
||||
return
|
||||
}
|
||||
if logger != nil {
|
||||
logger.Printf(format, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Log writes a debug message.
|
||||
func Log(v ...interface{}) {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
if !enabled {
|
||||
return
|
||||
}
|
||||
if logger != nil {
|
||||
logger.Println(v...)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user