From 441116450a416e06408d42f7a97a81302f81b5e8 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Wed, 18 Mar 2026 11:28:06 +0800 Subject: [PATCH] fix(qq): demote botgo heartbeat logs --- pkg/channels/qq/botgo_logger.go | 41 +++++++++++++++++++++++++++++++++ pkg/channels/qq/qq.go | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 pkg/channels/qq/botgo_logger.go diff --git a/pkg/channels/qq/botgo_logger.go b/pkg/channels/qq/botgo_logger.go new file mode 100644 index 000000000..0aea73437 --- /dev/null +++ b/pkg/channels/qq/botgo_logger.go @@ -0,0 +1,41 @@ +package qq + +import ( + "fmt" + "strings" + + "github.com/sipeed/picoclaw/pkg/logger" +) + +// botGoLogger preserves useful SDK info logs while demoting noisy heartbeat +// traffic to DEBUG so long-running QQ sessions do not spam the console. +type botGoLogger struct { + *logger.Logger +} + +func newBotGoLogger(component string) *botGoLogger { + return &botGoLogger{Logger: logger.NewLogger(component)} +} + +func (b *botGoLogger) Info(v ...interface{}) { + message := fmt.Sprint(v...) + if shouldDemoteBotGoInfo(message) { + b.Logger.Debug(message) + return + } + b.Logger.Info(message) +} + +func (b *botGoLogger) Infof(format string, v ...interface{}) { + message := fmt.Sprintf(format, v...) + if shouldDemoteBotGoInfo(message) { + b.Logger.Debug(message) + return + } + b.Logger.Info(message) +} + +func shouldDemoteBotGoInfo(message string) bool { + return strings.Contains(message, " write Heartbeat message") || + strings.Contains(message, " receive HeartbeatAck message") +} diff --git a/pkg/channels/qq/qq.go b/pkg/channels/qq/qq.go index e7849bb5d..21de76528 100644 --- a/pkg/channels/qq/qq.go +++ b/pkg/channels/qq/qq.go @@ -102,7 +102,7 @@ func (c *QQChannel) Start(ctx context.Context) error { return fmt.Errorf("QQ app_id and app_secret not configured") } - botgo.SetLogger(logger.NewLogger("botgo")) + botgo.SetLogger(newBotGoLogger("botgo")) logger.InfoC("qq", "Starting QQ bot (WebSocket mode)") // Reinitialize shutdown signal for clean restart.