refactor(logging): replace all print/log with structured slog logger
Cyrene CI / backend (push) Has been cancelled
Cyrene CI / frontend (push) Has been cancelled

- 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:
Aska committed 2026-08-12 21:31:06 +08:00
1 parent 628d416dcd
commit a58ec7325d
8 files changed
+55 -50

No files matched your search

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