refactor(logging): replace all print/log with structured slog logger
- main.go: 30+ log.Printf → logger.Infof - plugin/registry: 12 log.Printf → logger.Infof - db/db.go, ws/hub.go: log → logger - platform-bridge: fmt.Printf/println → logger.Info - Logs now: time=... level=INFO msg=... - 16 packages pass, vet clean
This commit is contained in:
1 parent
628d416dcd
commit
a58ec7325d
8 files changed
+55
-50
No files matched your search
+25
-24
@@ -6,6 +6,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
@@ -52,15 +53,15 @@ import (
|
||||
|
||||
func main() {
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
log.Println("🧠 Cyrene v2 启动中...")
|
||||
logger.Info("🧠 Cyrene v2 启动中...")
|
||||
|
||||
// === 1. Platform & Config ===
|
||||
plat := platform.Detect()
|
||||
log.Printf("[platform] %s", plat.Summary())
|
||||
logger.Infof("[platform] %s", plat.Summary())
|
||||
|
||||
cfg, err := config.Load()
|
||||
if err != nil {
|
||||
log.Printf("[config] .env load failed: %v", err)
|
||||
logger.Infof("[config] .env load failed: %v", err)
|
||||
}
|
||||
cfg.ValidateOrFatal()
|
||||
cfg.LogSanitized()
|
||||
@@ -74,7 +75,7 @@ func main() {
|
||||
MaxOpenConns: 25, MaxIdleConns: 5,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("[db] warning: %v (running without persistence)", err)
|
||||
logger.Infof("[db] warning: %v (running without persistence)", err)
|
||||
} else {
|
||||
defer database.Close()
|
||||
db.RunMigration(context.Background(), database, "memories", db.SplitSQL(memory.CreateTableSQL()))
|
||||
@@ -82,7 +83,7 @@ func main() {
|
||||
|
||||
// === 3. NATS (in-process) ===
|
||||
natsConn := nats.NewInProcess()
|
||||
log.Printf("[nats] ready")
|
||||
logger.Infof("[nats] ready")
|
||||
_ = natsConn
|
||||
|
||||
// === 4. Plugin Registry ===
|
||||
@@ -114,7 +115,7 @@ func main() {
|
||||
reg.Register(websearch.New(cfg.SearXNGURL), pluginCfg)
|
||||
}
|
||||
|
||||
log.Printf("[plugin] loaded %d plugins: %v", reg.Count(), reg.ListNames())
|
||||
logger.Infof("[plugin] loaded %d plugins: %v", reg.Count(), reg.ListNames())
|
||||
|
||||
// === 5. Voice Service ===
|
||||
voiceSvc := voicesvc.New(voicesvc.Config{
|
||||
@@ -122,24 +123,24 @@ func main() {
|
||||
TTSProviders: []string{cfg.TTSProvider},
|
||||
DashScopeKey: cfg.DashScopeAPIKey,
|
||||
})
|
||||
log.Printf("[voice] ready")
|
||||
logger.Infof("[voice] ready")
|
||||
|
||||
// === 6. Memory Service ===
|
||||
var memSvc *memory.Service
|
||||
if database != nil {
|
||||
memRepo := memory.NewRepository(database)
|
||||
memSvc = memory.NewService(memRepo)
|
||||
log.Printf("[memory] connected")
|
||||
logger.Infof("[memory] connected")
|
||||
} else {
|
||||
log.Printf("[memory] disabled (no database)")
|
||||
logger.Infof("[memory] disabled (no database)")
|
||||
}
|
||||
|
||||
// === 7. AI-Core: Persona ===
|
||||
personaLoader, err := persona.NewLoader(cfg.PersonaDir)
|
||||
if err != nil {
|
||||
log.Printf("[persona] load error: %v (using builtin)", err)
|
||||
logger.Infof("[persona] load error: %v (using builtin)", err)
|
||||
}
|
||||
log.Printf("[persona] loaded %d persona(s): %v", personaLoader.Count(), personaLoader.List())
|
||||
logger.Infof("[persona] loaded %d persona(s): %v", personaLoader.Count(), personaLoader.List())
|
||||
personaInjector := persona.NewInjector(personaLoader.Default())
|
||||
|
||||
// === 8. AI-Core: LLM Adapter ===
|
||||
@@ -154,11 +155,11 @@ func main() {
|
||||
llmSelector.DefaultAdapter().SetCallLogger(func(c llm.CallRecord) {
|
||||
llmCallLogger.Record(c)
|
||||
})
|
||||
log.Printf("[llm] adapter ready (model=%s)", cfg.LLMModel)
|
||||
logger.Infof("[llm] adapter ready (model=%s)", cfg.LLMModel)
|
||||
|
||||
// === 9. AI-Core: Context Store ===
|
||||
ctxStore := aiCoreCtx.NewStore(4000, 50)
|
||||
log.Printf("[context] sliding window ready (4000 tokens, 50 turns)")
|
||||
logger.Infof("[context] sliding window ready (4000 tokens, 50 turns)")
|
||||
|
||||
// === 10. AI-Core: Sub-session Manager ===
|
||||
subMgr := subsession.NewManager(
|
||||
@@ -182,7 +183,7 @@ func main() {
|
||||
},
|
||||
},
|
||||
)
|
||||
log.Printf("[subsession] 4 providers ready")
|
||||
logger.Infof("[subsession] 4 providers ready")
|
||||
|
||||
// === 11. AI-Core: Orchestrator ===
|
||||
semanticCache := llm.NewSemanticCache()
|
||||
@@ -192,7 +193,7 @@ func main() {
|
||||
memExtractor := memory.NewExtractor(memSvc, &memory.LLMAdapterBridge{Adapter: memAdapter})
|
||||
orch.SetMemoryExtractor(memExtractor)
|
||||
}
|
||||
log.Printf("[orchestrator] pipeline ready")
|
||||
logger.Infof("[orchestrator] pipeline ready")
|
||||
|
||||
// === 11.5 Platform Bridge ===
|
||||
bridgeCfgPath := "configs/bridge.json"
|
||||
@@ -209,7 +210,7 @@ func main() {
|
||||
loadAdaptersFromConfig(bridgeRouter, &bridge.BridgeConfig{Adapters: bridgeStore.GetAdapters()}, orch)
|
||||
bridgeRouter.StartAll()
|
||||
|
||||
log.Printf("[bridge] config store ready (path=%s, %d adapters)", bridgeCfgPath, bridgeStore.Count())
|
||||
logger.Infof("[bridge] config store ready (path=%s, %d adapters)", bridgeCfgPath, bridgeStore.Count())
|
||||
|
||||
// === 12. Gateway ===
|
||||
userStore := api.NewMemUserStore(cfg.AdminUsername, cfg.AdminPassword)
|
||||
@@ -256,7 +257,7 @@ func main() {
|
||||
// === 13. Start ===
|
||||
// Register restart handler — forks a new process and exits
|
||||
api.RestartFunc = func() {
|
||||
log.Printf("[gateway] restarting...")
|
||||
logger.Infof("[gateway] restarting...")
|
||||
reg.Shutdown()
|
||||
srv.Close()
|
||||
// Re-exec self with same args and env
|
||||
@@ -266,17 +267,17 @@ func main() {
|
||||
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("[gateway] restart failed: %v", err)
|
||||
logger.Fatalf("[gateway] restart failed: %v", err)
|
||||
}
|
||||
log.Printf("[gateway] new process PID=%d, exiting...", proc.Pid)
|
||||
logger.Infof("[gateway] new process PID=%d, exiting...", proc.Pid)
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
go func() {
|
||||
log.Printf("[gateway] listening on %s", addr)
|
||||
log.Printf("[gateway] plugins=%d tools=%d", reg.Count(), len(reg.GetAllToolDefinitions()))
|
||||
logger.Infof("[gateway] listening on %s", addr)
|
||||
logger.Infof("[gateway] plugins=%d tools=%d", reg.Count(), len(reg.GetAllToolDefinitions()))
|
||||
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||
log.Fatalf("[gateway] %v", err)
|
||||
logger.Fatalf("[gateway] %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -284,10 +285,10 @@ func main() {
|
||||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-quit
|
||||
|
||||
log.Println("[gateway] shutting down...")
|
||||
logger.Info("[gateway] shutting down...")
|
||||
reg.Shutdown()
|
||||
srv.Close()
|
||||
log.Println("Cyrene v2 已安全退出")
|
||||
logger.Info("Cyrene v2 已安全退出")
|
||||
|
||||
_ = voiceSvc
|
||||
_ = memSvc
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -68,7 +68,7 @@ func Connect(cfg Config) (*sql.DB, error) {
|
||||
return nil, fmt.Errorf("ping db: %w", err)
|
||||
}
|
||||
|
||||
log.Printf("[db] connected to %s:%d/%s (max_open=%d, max_idle=%d)",
|
||||
logger.Infof("[db] connected to %s:%d/%s (max_open=%d, max_idle=%d)",
|
||||
cfg.Host, cfg.Port, cfg.DBName, cfg.MaxOpenConns, cfg.MaxIdleConns)
|
||||
|
||||
return db, nil
|
||||
@@ -119,14 +119,14 @@ func Transaction(ctx context.Context, db *sql.DB, fn func(tx *sql.Tx) error) err
|
||||
|
||||
// RunMigration executes a list of SQL migration statements in order.
|
||||
func RunMigration(ctx context.Context, db *sql.DB, name string, statements []string) error {
|
||||
log.Printf("[db] running migration: %s (%d statements)", name, len(statements))
|
||||
logger.Infof("[db] running migration: %s (%d statements)", name, len(statements))
|
||||
|
||||
for i, stmt := range statements {
|
||||
if _, err := db.ExecContext(ctx, stmt); err != nil {
|
||||
return fmt.Errorf("migration %s[%d]: %w", name, i, err)
|
||||
}
|
||||
}
|
||||
log.Printf("[db] migration %s completed", name)
|
||||
logger.Infof("[db] migration %s completed", name)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package plugin
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@@ -36,7 +36,7 @@ func (r *Registry) Register(p Plugin, cfg PluginConfig) error {
|
||||
}
|
||||
|
||||
if !p.Enabled() {
|
||||
log.Printf("[plugin] %s is disabled, skipping", p.Name())
|
||||
logger.Infof("[plugin] %s is disabled, skipping", p.Name())
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -53,18 +53,18 @@ func (r *Registry) Register(p Plugin, cfg PluginConfig) error {
|
||||
// Auto-detect provider interfaces
|
||||
if iot, ok := p.(IoTProvider); ok {
|
||||
r.iotProviders = append(r.iotProviders, iot)
|
||||
log.Printf("[plugin] registered IoT provider: %s v%s", p.Name(), p.Version())
|
||||
logger.Infof("[plugin] registered IoT provider: %s v%s", p.Name(), p.Version())
|
||||
}
|
||||
if tool, ok := p.(ToolProvider); ok {
|
||||
r.toolProviders = append(r.toolProviders, tool)
|
||||
log.Printf("[plugin] registered tool provider: %s v%s (%d tools)", p.Name(), p.Version(), len(tool.Tools()))
|
||||
logger.Infof("[plugin] registered tool provider: %s v%s (%d tools)", p.Name(), p.Version(), len(tool.Tools()))
|
||||
}
|
||||
if rag, ok := p.(RAGProvider); ok {
|
||||
r.ragProviders = append(r.ragProviders, rag)
|
||||
log.Printf("[plugin] registered RAG provider: %s v%s", p.Name(), p.Version())
|
||||
logger.Infof("[plugin] registered RAG provider: %s v%s", p.Name(), p.Version())
|
||||
}
|
||||
|
||||
log.Printf("[plugin] %s v%s loaded successfully", p.Name(), p.Version())
|
||||
logger.Infof("[plugin] %s v%s loaded successfully", p.Name(), p.Version())
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -166,27 +166,27 @@ func (r *Registry) Shutdown() {
|
||||
continue
|
||||
}
|
||||
if err := p.Close(); err != nil {
|
||||
log.Printf("[plugin] error closing %s: %v", p.Name(), err)
|
||||
logger.Infof("[plugin] error closing %s: %v", p.Name(), err)
|
||||
}
|
||||
}
|
||||
|
||||
// Close IoT providers
|
||||
for _, p := range r.iotProviders {
|
||||
if err := p.Close(); err != nil {
|
||||
log.Printf("[plugin] error closing %s: %v", p.Name(), err)
|
||||
logger.Infof("[plugin] error closing %s: %v", p.Name(), err)
|
||||
}
|
||||
}
|
||||
// Close tool providers
|
||||
for _, p := range r.toolProviders {
|
||||
if err := p.Close(); err != nil {
|
||||
log.Printf("[plugin] error closing %s: %v", p.Name(), err)
|
||||
logger.Infof("[plugin] error closing %s: %v", p.Name(), err)
|
||||
}
|
||||
}
|
||||
// Close RAG providers
|
||||
for _, p := range r.ragProviders {
|
||||
if err := p.Close(); err != nil {
|
||||
log.Printf("[plugin] error closing %s: %v", p.Name(), err)
|
||||
logger.Infof("[plugin] error closing %s: %v", p.Name(), err)
|
||||
}
|
||||
}
|
||||
log.Printf("[plugin] all plugins shut down")
|
||||
logger.Infof("[plugin] all plugins shut down")
|
||||
}
|
||||
@@ -4,7 +4,7 @@ package ws
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
@@ -76,7 +76,7 @@ func (h *Hub) run() {
|
||||
h.clients[c] = true
|
||||
n := len(h.clients)
|
||||
h.mu.Unlock()
|
||||
log.Printf("[ws] client connected (total=%d)", n)
|
||||
logger.Infof("[ws] client connected (total=%d)", n)
|
||||
|
||||
case c := <-h.unregister:
|
||||
h.mu.Lock()
|
||||
@@ -103,7 +103,7 @@ func (h *Hub) run() {
|
||||
func (h *Hub) HandleUpgrade(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
log.Printf("[ws] upgrade error: %v", err)
|
||||
logger.Infof("[ws] upgrade error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
// It defines unified message types and adapter interfaces for QQ, Telegram, Discord, and Webhook.
|
||||
package bridge
|
||||
|
||||
import "time"
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
)
|
||||
|
||||
// UnifiedMessage is the internal representation of a message from any platform.
|
||||
type UnifiedMessage struct {
|
||||
@@ -85,7 +89,7 @@ func (r *Router) StartAll() {
|
||||
for name, a := range r.adapters {
|
||||
go func(name string, a Adapter) {
|
||||
if err := a.Start(); err != nil {
|
||||
println("[bridge]", name, "start error:", err.Error())
|
||||
logger.Info("[bridge]", name, "start error:", err.Error())
|
||||
return
|
||||
}
|
||||
for msg := range a.Incoming() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package discord
|
||||
import (
|
||||
"fmt"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/platform-bridge"
|
||||
)
|
||||
type Config struct{ Name, Token string }
|
||||
@@ -17,5 +17,5 @@ func (a *Adapter) Stop() error { close(a.done); return nil }
|
||||
func (a *Adapter) Incoming() <-chan *bridge.UnifiedMessage { return a.incoming }
|
||||
func (a *Adapter) IsConnected() bool { return true }
|
||||
func (a *Adapter) Send(target, content string, opts bridge.SendOptions) error {
|
||||
fmt.Printf("[dc:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
logger.Infof("[dc:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package telegram
|
||||
import (
|
||||
"fmt"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/platform-bridge"
|
||||
)
|
||||
type Config struct{ Name, Token string }
|
||||
@@ -17,5 +17,5 @@ func (a *Adapter) Stop() error { close(a.done); return nil }
|
||||
func (a *Adapter) Incoming() <-chan *bridge.UnifiedMessage { return a.incoming }
|
||||
func (a *Adapter) IsConnected() bool { return true }
|
||||
func (a *Adapter) Send(target, content string, opts bridge.SendOptions) error {
|
||||
fmt.Printf("[tg:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
logger.Infof("[tg:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package webhook
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"net/http"
|
||||
"time"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/platform-bridge"
|
||||
@@ -31,5 +31,5 @@ func (a *Adapter) Stop() error { if a.server!=nil { a.server.Close() }; close(a.
|
||||
func (a *Adapter) Incoming() <-chan *bridge.UnifiedMessage { return a.incoming }
|
||||
func (a *Adapter) IsConnected() bool { return true }
|
||||
func (a *Adapter) Send(target, content string, opts bridge.SendOptions) error {
|
||||
fmt.Printf("[webhook:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
logger.Infof("[webhook:%s] -> %s: %s\n", a.cfg.Name, target, content); return nil
|
||||
}
|
||||
Reference in new issue
Block a user