From a58ec7325d223a6f6d58ad29d8c6ed377ef65ef5 Mon Sep 17 00:00:00 2001 From: Aska Date: Wed, 12 Aug 2026 21:31:06 +0800 Subject: [PATCH] refactor(logging): replace all print/log with structured slog logger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- backend/cmd/cyrene/main.go | 49 ++++++++++--------- backend/internal/db/db.go | 8 +-- backend/internal/plugin/registry.go | 22 ++++----- backend/services/gateway/ws/hub.go | 6 +-- backend/services/platform-bridge/bridge.go | 8 ++- .../platform-bridge/discord/adapter.go | 4 +- .../platform-bridge/telegram/adapter.go | 4 +- .../platform-bridge/webhook/adapter.go | 4 +- 8 files changed, 55 insertions(+), 50 deletions(-) diff --git a/backend/cmd/cyrene/main.go b/backend/cmd/cyrene/main.go index 4ebe6a4..cbc3510 100644 --- a/backend/cmd/cyrene/main.go +++ b/backend/cmd/cyrene/main.go @@ -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 diff --git a/backend/internal/db/db.go b/backend/internal/db/db.go index b1706c6..d9c0c98 100644 --- a/backend/internal/db/db.go +++ b/backend/internal/db/db.go @@ -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 } diff --git a/backend/internal/plugin/registry.go b/backend/internal/plugin/registry.go index 6340674..711365e 100644 --- a/backend/internal/plugin/registry.go +++ b/backend/internal/plugin/registry.go @@ -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") } diff --git a/backend/services/gateway/ws/hub.go b/backend/services/gateway/ws/hub.go index bc26a6c..4e6a8a5 100644 --- a/backend/services/gateway/ws/hub.go +++ b/backend/services/gateway/ws/hub.go @@ -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 } diff --git a/backend/services/platform-bridge/bridge.go b/backend/services/platform-bridge/bridge.go index 4448f6c..e6c375d 100644 --- a/backend/services/platform-bridge/bridge.go +++ b/backend/services/platform-bridge/bridge.go @@ -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() { diff --git a/backend/services/platform-bridge/discord/adapter.go b/backend/services/platform-bridge/discord/adapter.go index 521fad3..18dfb3c 100644 --- a/backend/services/platform-bridge/discord/adapter.go +++ b/backend/services/platform-bridge/discord/adapter.go @@ -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 } diff --git a/backend/services/platform-bridge/telegram/adapter.go b/backend/services/platform-bridge/telegram/adapter.go index fea634c..e64de2f 100644 --- a/backend/services/platform-bridge/telegram/adapter.go +++ b/backend/services/platform-bridge/telegram/adapter.go @@ -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 } diff --git a/backend/services/platform-bridge/webhook/adapter.go b/backend/services/platform-bridge/webhook/adapter.go index c44d2ca..3eb6748 100644 --- a/backend/services/platform-bridge/webhook/adapter.go +++ b/backend/services/platform-bridge/webhook/adapter.go @@ -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 }