From b8e18dd75c7a93997c5985f22f597043933f1d2e Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 12 Sep 2022 00:29:12 +0800 Subject: [PATCH] notifier: redirect error, panic, fatal error to telegram --- pkg/bbgo/environment.go | 2 + pkg/notifier/telegramnotifier/logrus_look.go | 39 ++++++++++++++++++++ pkg/notifier/telegramnotifier/telegram.go | 2 +- pkg/slack/slacklog/logrus_look.go | 2 +- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 pkg/notifier/telegramnotifier/logrus_look.go diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index 76426b756..639a7fbe7 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -1012,6 +1012,8 @@ func (environ *Environment) setupTelegram(userConfig *Config, telegramBotToken s var notifier = telegramnotifier.New(bot, opts...) Notification.AddNotifier(notifier) + log.AddHook(telegramnotifier.NewLogHook(notifier)) + // allocate a store, so that we can save the chatID for the owner var messenger = interact.NewTelegram(bot) diff --git a/pkg/notifier/telegramnotifier/logrus_look.go b/pkg/notifier/telegramnotifier/logrus_look.go new file mode 100644 index 000000000..eb93e9e20 --- /dev/null +++ b/pkg/notifier/telegramnotifier/logrus_look.go @@ -0,0 +1,39 @@ +package telegramnotifier + +import ( + "fmt" + "time" + + "github.com/sirupsen/logrus" + "golang.org/x/time/rate" +) + +var limiter = rate.NewLimiter(rate.Every(time.Minute), 3) + +type LogHook struct { + notifier *Notifier +} + +func NewLogHook(notifier *Notifier) *LogHook { + return &LogHook{ + notifier: notifier, + } +} + +func (t *LogHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.ErrorLevel, + logrus.FatalLevel, + logrus.PanicLevel, + } +} + +func (t *LogHook) Fire(e *logrus.Entry) error { + if !limiter.Allow() { + return nil + } + + var message = fmt.Sprintf("[%s] %s", e.Level.String(), e.Message) + t.notifier.Notify(message) + return nil +} diff --git a/pkg/notifier/telegramnotifier/telegram.go b/pkg/notifier/telegramnotifier/telegram.go index 0afe4566f..b13c3c1a0 100644 --- a/pkg/notifier/telegramnotifier/telegram.go +++ b/pkg/notifier/telegramnotifier/telegram.go @@ -35,7 +35,7 @@ func UseBroadcast() Option { } } -// New +// New returns a telegram notifier instance func New(bot *telebot.Bot, options ...Option) *Notifier { notifier := &Notifier{ bot: bot, diff --git a/pkg/slack/slacklog/logrus_look.go b/pkg/slack/slacklog/logrus_look.go index e4349a021..dce4c2685 100644 --- a/pkg/slack/slacklog/logrus_look.go +++ b/pkg/slack/slacklog/logrus_look.go @@ -11,7 +11,7 @@ import ( "golang.org/x/time/rate" ) -var limiter = rate.NewLimiter(rate.Every(time.Minute), 45) +var limiter = rate.NewLimiter(rate.Every(time.Minute), 3) type LogHook struct { Slack *slack.Client