package tgbot import ( "fmt" "log/slog" "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) // SetLibraryLogger направляет внутренние логи клиента tgbotapi в наш slog. // // Зачем: библиотека логирует сбои long-poll `getUpdates` через собственный // (stdlib `log`) логгер — МИМО slog. Из-за этого сетевые/API-ошибки поллинга не // попадали в структурированные JSON-логи: входящее сообщение молча не // подхватывалось, а в логах — пусто (см. logging.md). После вызова такие сбои // видны как `telegram library` (WARN). // // Токен вырезается из текста: строка ошибки транспорта — `*url.Error` с URL вида // `…/bot/getUpdates`, писать её как есть нельзя (утечка секрета в логи). // Замена по подстроке страхует и от прочих мест, где токен мог бы просочиться. // // Логгер в tgbotapi — глобальный на пакет; вызывать один раз при старте. func SetLibraryLogger(log *slog.Logger, token string) error { return tgbotapi.SetLogger(libLogger{log: log, token: token}) } type libLogger struct { log *slog.Logger token string } func (l libLogger) Println(v ...any) { l.emit(fmt.Sprintln(v...)) } func (l libLogger) Printf(format string, v ...any) { l.emit(fmt.Sprintf(format, v...)) } func (l libLogger) emit(msg string) { msg = strings.TrimSpace(msg) if l.token != "" { msg = strings.ReplaceAll(msg, l.token, "***") } // Сбои поллинга транзиентны (библиотека повторяет через 3 с) — WARN // («retry внешнего вызова»); устойчивый сбой станет потоком WARN — сигнал // разбираться, но не ERROR на каждый повтор. l.log.Warn("telegram library", "detail", msg) }